[デザインモード]Flyw 8モード


Fly 8(Flyway)パターン


インスタンスを共有することでメモリをできるだけ節約するモード

👿 問題の状況


私は心理ゲームに木を設置したいです.
ツリーは、色(color)を決定したり、特定の位置(x,y)に設定したりすることができる.
もし私がマークに夢中になって地図に10000本の木を植えると言ったら、
1本の木のデータ
色:4 Byte,x:4 Byte,y:4 Byte.
各ツリーにオブジェクトが作成されている場合、10000ツリーには12,000バイトが必要です.

熱狂的な人々はもっと木を建てますが、私~~ではメモリが爆発する可能性があります.

😇 解決方法


すべての木のx,yは違いますが、木の色はいつも変える必要はありませんよね?ほとんど同じようにたまに色を変えます
では、いつも新しい木を作らないで、保存して使う方法で作ったら?

新しい色のツリーを追加するときだけ新しいオブジェクトを作成する場合は、
10000本の木があっても12*(新しい色を追加した回数)byteはこんな風になります!
もし私が2色しか使わなかったら、24バイトで、以前より11976バイトぐらい節約しました!
木が多ければ多いほど、節約になります!
Fly 8モードでは、インスタンスをできるだけ共有し、newでメモリの無駄を減らすことができます.

🤔 実装方法


「ヘビー級」モードを実装するには、次の3つが必要です.

  • 実際に共有するオブジェクト(ツリー)

  • ファクトリのオブジェクトインスタンスの作成と共有
    ->同じ色のツリーがない場合は新しいツリーを作成し、ある場合はその色のツリーを返します.

  • 使用パターンのクライアント、クライアント
    ->2番にOO色の木を1本お願いし、受け取ったらX、Yをセットしてインストールすればいいだけです.
  • 📜 コードを見てみましょう!

  • 共有するツリーオブジェクト
  • public class Tree {
    
        // 나무는 아래와 같이 3개 정보를 가지고 있습니다.
        private String color;
        private int x;
        private int y;
    
        //색상으로만 생성자를 만들어줄게요.
        public Tree(String color) {
            this.color = color;
        }
    
        public void setX(int x) {
            this.x = x;
        }
    
        public void setY(int y) {
            this.y = y;
        }
    
        //나무를 심을 때
        public void install(){
            System.out.println("x:"+x+" y:"+y+" 위치에 "+color+"색 나무를 설치했습니다!");
        }
    }
    TreeFactory は、
  • ツリーを提供します.
    public class TreeFactory {
        //HashMap 자료구조를 활용해서 만들어진 나무들을 관리해볼게요
        public static final HashMap<String, Tree> treeMap = new HashMap<>();
        
       
        public static Tree getTree(String treeColor){
            //Map에 입력받은 색상의 나무가 있는지 찾습니다. 있으면 그 객체를 제공합니다.
            Tree tree = (Tree)treeMap.get(treeColor); 
    
           //만약 아직 같은 색상의 나무가 Map에 없다면 새로 객체를 생성해 제공합니다.
            if(tree == null){
                tree = new Tree(treeColor);
                treeMap.put(treeColor, tree);
                System.out.println("새 객체 생성");
            }
    
            return tree;
        }
    }
  • 顧客
  • import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            
            System.out.println("원하는 색을 입력해주세요 :)");
            for(int i=0;i<10;i++){
                //나무 색 입력받기
                String input = scanner.nextLine();
                //팩토리에서 나무 하나 공급받기
                Tree tree = (Tree)TreeFactory.getTree(input);
                //나무 x,y 설정하고
                tree.setX((int) (Math.random()*100));
                tree.setY((int) (Math.random()*100));
                //나무 설치하기
                tree.install();
            }
    
        }
    }
    💻 結果
    異なる色を入力した場合にのみ、新しいオブジェクトが作成されます.
    원하는 색을 입력해주세요 :)
    초록
    새로운 객체 생성
    x:47 y:55 위치에 초록색 나무를 설치했습니다!
    연두
    새로운 객체 생성
    x:86 y:33 위치에 연두색 나무를 설치했습니다!
    초록
    x:62 y:30 위치에 초록색 나무를 설치했습니다!
    초록
    x:83 y:21 위치에 초록색 나무를 설치했습니다!
    초록
    x:47 y:46 위치에 초록색 나무를 설치했습니다!
    연두
    x:49 y:59 위치에 연두색 나무를 설치했습니다!
    연두
    x:10 y:38 위치에 연두색 나무를 설치했습니다!
    카키
    새로운 객체 생성
    x:78 y:39 위치에 카키색 나무를 설치했습니다!
    카키
    x:21 y:41 위치에 카키색 나무를 설치했습니다!
    카키
    x:58 y:26 위치에 카키색 나무를 설치했습니다!

    「M」ブランドと違うのは何ですか?


  • モノトーンもオブジェクトを作成して使用するモードです.
    二人の違いは何ですか.
    私たちの木の例を考えてみましょうか.
    私たちが作ったFly 8の図案では、
    色が変わると、ツリーに新しいオブジェクトが作成されます.
    色ごとに1つのツリーが生成され、結果として複数のツリーが生成されます.
    また、作成したオブジェクトの色は変更できません.
    したがって、1つ以上のタイプを持つことができます.
    モノトーンモードであれば、
    ツリークラスに1つのツリーしか作成できません.
    したがって、モノトーンモードを使用すると、
    作成した個々のオブジェクト(ツリー)の色を変更する必要があります.
    異なる点は、必要に応じて変数を変更および書き込むのではなく、クラスにインスタンスを作成できることです.
    したがって、タイプにかかわらず、単一の色調パターンしかありません.
  • 😎 すばらしい事実


    実際、軽量レベルモードはJavaのString Constant Poolに適用されます...!
    JavaのStringは、作成時にString Constant Poolに格納されます.
    同じ文字列がpoolにある場合は、読み込み方式で存在します!
    (私のブログ記事整理関連内容:リンク)
    そのため、String classはFly 8モードを適用してメモリを節約することができます!

    💕 リファレンスリンク


  • 基本モード説明+省容量(再ロード)
    https://refactoring.guru/design-patterns/flyweight

  • 軽量レベルモードのJava実装例
    https://lee1535.tistory.com/106

  • FlywayパターンとString Constant Poolについて
    https://it-mesung.tistory.com/183

  • ツリーの例の詳細
    https://m.blog.naver.com/2feelus/220669069127

  • モノトーンとの比較
    https://medium.com/remember/flyweight-pattern-f02c771a72fb