構造パターンの 1 つは、同様のオブジェクトとできるだけ多くのデータを共有することでメモリ使用量を削減することを目的としています。
これは、多数の同様のオブジェクトを処理する場合、オブジェクトごとに新しいインスタンスを作成するとメモリ消費量の点でコストがかかる場合に特に役立ちます。
重要な概念:
固有の状態: 複数のオブジェクト間で共有される状態はコンテキストから独立しており、異なるオブジェクト間でも同じままです。
外部状態: 各オブジェクトに固有であり、クライアントから渡される状態。この状態は変化する可能性があり、Flyweight オブジェクトには保存されません
主な参加者:
Flyweight: Flyweight オブジェクトが Extrinsic 状態を受け取り、それを使用するインターフェイス。
ConcreteFlyweight: Flyweight を実装し、固有の状態を保存します。
FlyweightFactory: Flyweight オブジェクトを管理し、インターフェイスの共有を確保します。すでに存在する場合は既存の Flyweight を返します。
クライアント(Main クラスと同様): Flyweight への参照を維持し、Flyweight オブジェクトと対話する必要がある場合に外部状態を提供します。
キャラクターの Flyweight オブジェクトの例を見てみましょう
大量のテキストを表示する必要があるテキスト エディタがあるとします。各文字はオブジェクトとして表すことができますが、文字ごとに個別のオブジェクトを持つと大量のメモリが無駄になります。代わりに、Flyweight を使用して各文字を表す文字オブジェクトを共有し、位置や書式設定などの外部状態を外部に保存できます
フライウェイト
public interface Flyweight { public void display(int x, int y);//x, y are the extrinsic state of the Flyweight object }
コンクリートフライウェイト
public class CharacterFlyweight implements Flyweight { private char ch; public CharacterFlyweight(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 FlyweightFactory { private static HashMapflyweights = new HashMap(); public static Flyweight getFlyweight(char c){ Flyweight flyweight = flyweights.getOrDefault(c,null); if(null==flyweight){ flyweight = new CharacterFlyweight(c); flyweights.put(c,flyweight); } return flyweight; } }
主要
public class Main { public static void main(String args[]){ Flyweight flyweight1 = FlyweightFactory.getFlyweight('a'); Flyweight flyweight2 = FlyweightFactory.getFlyweight('b'); Flyweight flyweight3 = FlyweightFactory.getFlyweight('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)]
キーポイント
デメリット
複雑さ: パターンにより、特に外部状態と内部状態を個別に管理する場合に、コードが複雑になる可能性があります。
オーバーヘッド: 共有するオブジェクトがほとんどない場合、Flyweight パターンによりメモリが大幅に節約されずに不必要な複雑さが生じる可能性があります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3