運用共享技術有效支援大量細粒度對象。核心思想:相同對象僅共享一份實例,避免重複創建。
public abstract class Flyweight {
public abstract void operation();
}
public class ConcreteFlyweight extends Flyweight {
private final String intrinsicState; // 內部狀態:可共享
public ConcreteFlyweight(String state) { this.intrinsicState = state; }
public void operation() {
System.out.println("Concrete Flyweight: " + intrinsicState);
}
}
public class FlyweightFactory {
private final Hashtable flyweights = new Hashtable(); // 對象池
public Flyweight getFlyweight(Object key) {
Flyweight fw = (Flyweight) flyweights.get(key);
if (fw == null) {
fw = new ConcreteFlyweight((String) key);
flyweights.put(key, fw);
}
return fw;
}
public int getSize() { return flyweights.size(); }
}
FlyweightFactory factory = new FlyweightFactory();
Flyweight f1 = factory.getFlyweight("Google");
Flyweight f2 = factory.getFlyweight("Qutr");
Flyweight f3 = factory.getFlyweight("Google"); // 復用 f1
Flyweight f4 = factory.getFlyweight("Google");
Flyweight f5 = factory.getFlyweight("Google");
Flyweight f6 = factory.getFlyweight("Google");
// 輸出 6 次,但實際對象僅 2 個
System.out.println("objSize = " + factory.getSize()); // 2
String a = "hello"; String b = "hello"; System.out.println(a == b); // true!比較的是引用地址
字面量字串編譯期進入常量池,相同值共享同一實例。這是 JVM 級別的 Flyweight 實現。
| 類型 | 特徵 | 存儲位置 |
|---|---|---|
| 內部狀態 | 可共享、不隨環境變化 | 享元對象內部 |
| 外部狀態 | 隨環境變化、不可共享 | 客戶端管理,調用時傳入 |