Javaにおけるフライウェイトパターンの実装方法
Javaでは、フライウエイトパターンを以下の手順で実装できます。
- 共有オブジェクトのインターフェイス(フライウェイト・インターフェイス):共有オブジェクトの操作方法を定義するインターフェイス。
public interface Flyweight {
void operation();
}
- 具体的な共有オブジェクト(コンクリートフライウェイト)クラスを作成します。共有オブジェクトの操作方法を実装しており、フライウェイトインターフェイスを実装しています。
public class ConcreteFlyweight implements Flyweight {
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
@Override
public void operation() {
System.out.println("具体享元对象的操作:" + intrinsicState);
}
}
- ファクトリーメソッドを利用して享元クラスを作成する:このファクトリーメソッドは共有オブジェクトを作成・管理し、作成済みの共有オブジェクトを保持するためのコレクションを保持する。
public class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<>();
public Flyweight getFlyweight(String key) {
if (flyweights.containsKey(key)) {
return flyweights.get(key);
} else {
Flyweight flyweight = new ConcreteFlyweight(key);
flyweights.put(key, flyweight);
return flyweight;
}
}
}
- 共有オブジェクトを利用する:クライアントから共有ファクトリを通じて共有オブジェクトを取得し、メソッドを呼び出す。
public class Client {
public static void main(String[] args) {
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight1 = factory.getFlyweight("A");
flyweight1.operation();
Flyweight flyweight2 = factory.getFlyweight("B");
flyweight2.operation();
Flyweight flyweight3 = factory.getFlyweight("A");
flyweight3.operation();
}
}
ネイティブの日本語で言い換えると
具体享元对象的操作:A
具体享元对象的操作:B
具体享元对象的操作:A
この例では、フライウェイトファクトリークラスは渡されたパラメータに基づいて共用オブジェクトを取得する。共用オブジェクトがすでに作成済みの場合、直接それを返す。作成されていなければ、新しい共用オブジェクトを作成してコレクションの中に保存する。クライアントはフライウェイトファクトリーを通じて共用オブジェクトを取得し、その操作メソッドを呼び出す。共用オブジェクトは共用可能なので、複数のクライアントが同じオブジェクトを共用でき、メモリ使用量を削減できる。