[デザインモード]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
Reference
この問題について([デザインモード]Flyw 8モード), 我々は、より多くの情報をここで見つけました https://velog.io/@hoit_98/디자인-패턴-Flyweight-패턴テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol