用的時間點
當想要節省記憶體空間的時候使用。
如何設計
儘量共用物件個體,不做無謂的new。
程式範例
輸出大型文字。
Flyweight 參與者
表示以一般處理會讓程式變重,因此選擇共用較佳的參與者。例如BigChar類別。
Flyweight FlyweightFactory 參與者
產生Flyweight 參與者的工廠。利用這個工廠來產生 Flyweight 參與者,即可共用物件個體。 例如BigCharFactory類別。
Client 參與者
利用 FlyweightFactory 參與者產生並使用 Flyweight 參與者。例如 BigString 類別。
問題
1. 在 BigString 中新增如下的建構子。BigString(String string, boolean shared),若 shared 為 true 則共用 BigChar;若為 false 則不共用。
若不共用 BigChar,則不使用 BigCharFactory 而改用 new 的方式。
2. 利用上一個問題所修改的 BigString 類別,比較共用和不共用 BigChar 的物件個體時的記憶體使用量。
結果的確是共用的話,記憶體耗用較少。
public class Main {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Usage: java Main digits");
System.out.println("Example: java Main 1212123");
System.exit(0);
}
BigString bs;
bs = new BigString(args[0], false); // 不共用
bs.print();
bs = new BigString(args[0], true); // 共用
bs.print();
}
}
3. 在 BigCharFactory 類別中,getBigChar 是 synchronized 方法。如果不設為 synchronize,會出現什麼問題?
在多個 Thread 呼叫時,可能會有重複 new 的情形。