構造パターンの 1 つは、同様のオブジェクトとできるだけ多くのデータを共有することでメモリ使用量を削減することを目的としています。
これは、多数の同様のオブジェクトを扱う場合に特に役立ちます。オブジェクトごとに新しいインスタンスを作成するとメモリ消費量の点でコストが高くなります
。
主要な概念:
固有の状態: 複数のオブジェクト間で共有される状態はコンテキストから独立しており、異なるオブジェクト間でも同じままです。
外部状態: 各オブジェクトに固有であり、クライアントから渡される状態。この状態は変化する可能性があり、フライ級 オブジェクトには保存されません
主な参加者:
フライ級: フライ級 オブジェクトが Extrinsic 状態を受け取り、それを使用するインターフェース。
Concreteフライ級: フライ級 を実装し、固有の状態を保存します。
フライ級Factory: フライ級 オブジェクトを管理し、インターフェイスの共有を確保します。すでに存在する場合は既存の フライ級 を返します。
クライアント (Main クラスと同様): フライ級 への参照を維持し、フライ級 オブジェクトと対話する必要がある場合に外部状態を提供します。
キャラクターの フライ級 オブジェクトの例を見てみましょう
大量のテキストを表示する必要があるテキスト エディタがあるとします。各文字はオブジェクトとして表すことができますが、文字ごとに個別のオブジェクトを持つと大量のメモリが浪費されます。代わりに、フライ級 を使用して各文字を表す文字オブジェクトを共有し、位置や書式などの外部状態を外部に保存できます
フライ級
public interface フライ級 { public void display(int x, int y);//x, y are the extrinsic state of the フライ級 object }
コンクリートフライウェイト
public class Characterフライ級 implements フライ級 { private char ch; public Characterフライ級(char c){ this.ch = c; } @Override public void display(int x ,int y){ System.out.println("[drawing character: "+this.ch+" at co-ordinates:("+x+","+y+")]"); } }
フライウェイトファクトリー
public class フライ級Factory { private static HashMap<character> flyweights = new HashMap(); public static フライ級 getフライ級(char c){ フライ級 flyweight = flyweights.getOrDefault(c,null); if(null==flyweight){ flyweight = new Characterフライ級(c); flyweights.put(c,flyweight); } return flyweight; } } </character>
メイン
public class Main { public static void main(String args[]){ フライ級 flyweight1 = フライ級Factory.getフライ級('a'); フライ級 flyweight2 = フライ級Factory.getフライ級('b'); フライ級 flyweight3 = フライ級Factory.getフライ級('a');// will use the same object that is referenced by flyweight1 flyweight1.display(1, 2);//'a' displayed at 1,2 flyweight2.display(3, 4);//'b' displayed at 3,4 flyweight3.display(5, 7); // 'a'(shared) displayed at 5,7 } }
出力:
[drawing character: a at co-ordinates:(1,2)] [drawing character: b at co-ordinates:(3,4)] [drawing character: a at co-ordinates:(5,7)]
重要なポイント
デメリット
複雑さ: パターンにより、特に外部状態と内部状態を個別に管理する場合に、コードが複雑になる可能性があります。
オーバーヘッド: 共有するオブジェクトが少ない場合、フライ級 パターンによりメモリが大幅に節約されずに不必要な複雑さが生じる可能性があります。
以上がフライ級の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。