デザインパターン フライウェイトパターン 備考
説明する
デザインパターン〜フライウェイトパターンの学習の書き方を記録します。使用される JDK バージョンはバージョン 1.8 です。
フライ級(フライ級)
目的: 共有テクノロジーを使用して、多数のきめの細かいオブジェクトを効率的にサポートします。
構造:
で:
- Flyweight は、Flyweight が外部状態を受け入れ、外部状態に作用できるインターフェイスを記述します。
- ConcreteFlyweight は Flyweight インターフェイスを実装し、内部状態 (存在する場合) 用のストレージ スペースを追加します。ConcreteFlyweight オブジェクトは共有可能である必要があります。保存される状態は内部的である必要があります。つまり、ConcreteFlyweight オブジェクトのシーンから独立している必要があります。
- すべての Flyweight サブクラスを共有する必要はありません。Flyweight インターフェイスにより共有が可能になりますが、共有が強制されるわけではありません。Flyweight オブジェクト構造のあるレベルでは、UnsharedConcreteFlyweight オブジェクトは通常、子ノードとして ConcreteFlyweight オブジェクトを持ちます。
- FlyweightFactory は Flyweight オブジェクトを作成および管理します。Flyweight の合理的な共有を確保し、ユーザーが Flyweight を要求すると、FlyweightFactory オブジェクトは作成されたインスタンスを提供するか、インスタンスが存在しない場合はインスタンスを作成します。
- クライアントはフライウェイトへの参照を維持します。1 つ以上のフライウェイトの外部状態を計算または保存します。
適用性:
- アプリケーションは多数のオブジェクトを使用します。
- これは完全に、多数のオブジェクトの使用が原因であり、その結果、ストレージのオーバーヘッドが大きくなります。
- オブジェクトの状態のほとんどは外部にすることができます。
- オブジェクトの外部状態を削除すると、多くのオブジェクト グループを比較的少数の共有オブジェクトに置き換えることができます。
- アプリケーションはオブジェクト ID に依存しません。Flyweight オブジェクトは共有できるため、概念的に異なるオブジェクトに対してアイデンティティ テストは true を返します。
使用するシーン:
- システムには同一または類似のオブジェクトが多数存在し、大量のメモリを消費します。
- オブジェクトの状態のほとんどは外部化でき、これらの外部状態をオブジェクトに渡すことができます。
- フライウェイト モードを使用する場合、フライウェイト オブジェクトを保存するためにフライウェイト プールを維持する必要があり、これには一定量のシステム リソースが必要となるため、フライウェイト オブジェクトを複数回再利用する必要がある場合にのみフライウェイト モードを使用する価値があります。
目次
フライウェイト パターンのクラス図の例
この UML クラス図を使用して、フライウェイト パターンの例を実装します。
抽象グラフィックスクラス
package com.example.deesign_patterns.flyweight;
//抽象享元角色
public abstract class AbstractBox {
//获取图形的方法
public abstract String getShape();
//显示图形及颜色
public void display(String color){
System.out.println("方块形状:"+getShape()+",方块颜色:"+color);
}
}
アイグラフィックス
package com.example.deesign_patterns.flyweight;
//I图形类(具体享元角色)
public class IBox extends AbstractBox{
@Override
public String getShape() {
return "I";
}
}
Lグラフィックスクラス
package com.example.deesign_patterns.flyweight;
//L图形类(具体享元角色)
public class LBox extends AbstractBox{
@Override
public String getShape() {
return "L";
}
}
Oグラフィックスクラス
package com.example.deesign_patterns.flyweight;
//O图形类(具体享元角色)
public class OBox extends AbstractBox{
@Override
public String getShape() {
return "O";
}
}
ファクトリークラス
package com.example.deesign_patterns.flyweight;
import java.util.HashMap;
//工厂类,将该类设计为单例
public class BoxFactory {
private HashMap<String,AbstractBox> map;
//使用单例模式-饿汉式静态成员变量方式
private static BoxFactory factory=new BoxFactory();
//在构造方法中进行初始化操作
public BoxFactory() {
map=new HashMap<String,AbstractBox>();
map.put("I",new IBox());
map.put("L",new LBox());
map.put("O",new OBox());
}
//提供一个方法获取该工厂类对象
public static BoxFactory getInstance(){
return factory;
}
//根据名称获取图形对象
public AbstractBox getShape(String name){
return map.get(name);
}
}
テストクラス
package com.example.deesign_patterns.flyweight;
//测试类
public class Client {
public static void main(String[] args) {
//获取I图形对象
AbstractBox box1 = BoxFactory.getInstance().getShape("I");
box1.display("灰色");
//获取L图形对象
AbstractBox box2 = BoxFactory.getInstance().getShape("L");
box2.display("绿色");
//获取O图形对象
AbstractBox box3 = BoxFactory.getInstance().getShape("O");
box3.display("灰色");
//获取O图形对象
AbstractBox box4 = BoxFactory.getInstance().getShape("O");
box4.display("红色");
System.out.println("两次获取到的O图形对象是否是同一个对象:"+(box3==box4));
}
}
利点:
- メモリ内の類似または同一のオブジェクトの数を大幅に減らし、システム リソースを節約し、システム パフォーマンスを向上させます。
- フライウェイト モードの外部状態は比較的独立しており、内部状態には影響を与えません。
デメリット:
オブジェクトを共有可能にするには、フライウェイト オブジェクトの状態の一部を外部化し、内部状態と外部状態を分離する必要があり、プログラム ロジックが複雑になります。