一講到Flyweight,它最主要工作就是要減少記憶體的使用量,至於要怎麼做來能達到這樣的效果呢?現在就讓我們藝起來了解吧!
大家在使用電腦的時候,最基本的技能肯定包含打字,每當在文字編輯器輸入一個字,電腦就會創建一個「字」的類別,而「字」的屬性大致上有字型、顏色、大小等等。
假設在沒有使用Flyweight的情況下,每輸入一個字就會創造一個字的類別,無形中系統的記憶體就很有可能很快地被占滿,導致性能變差;反之,使用者第一次輸入「A」,會產生一個「A」的類別,若使用者再輸入一次「A」,則會返回之前所創建的「A」類別,如此就不會在無意間創出許多重複的類別,避免大部分的記憶體被占用。
而物件有分[內在狀態]與[外在狀態],內在狀態就像是「A」的字型、顏色、大小,能夠再不同的物件之間做共享,因為他們彼此相似;而外在狀態就像是「A」的行、列,表示了這個字在此文件的位置,即使是相同物件,也不會在同樣的文件裡有相同的位置,故這些屬性也不會相似,因此就不能在不同物件間共享。
import java.util.HashMap;
class Context {
private Type intrinsic;
private Flyweight flyweight;
FlyweightFactory factory = new FlyweightFactory();
public Context(Type intrinsic, Type extrinsic) {
this.intrinsic = intrinsic;
this.flyweight = factory.getFlyweight(extrinsic);
}
public void operation() {
flyweight.operation(intrinsic);
}
}
class FlyweightFactory {
private static HashMap <Type, Flyweight> f =new HashMap<Type, Flyweight>();
public static Flyweight getFlyweight(Type extrinsic) {
Flyweight fly = null;
if (f.containsKey(extrinsic)) {
fly = f.get(extrinsic);
} else {
fly = new Flyweight();
f.put(extrinsic, fly);
}
return fly;
}
}
class Flyweight {
private Type extrinsic;
public void operation(Type intrinsic) {
// do something
}
}
雖然Flyweight很常與Factory協同合作,但它屬於Structural Patterns之一,而不是和Factory一樣是Creational Patterns。如果你的程式有大量重複的物件,就可以試著將Flyweight Pattern套用在你的程式上面,如此一來就可以節省大量的記憶體,電腦性能也不會因為因此而降低。
除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章
juck30808 - Python - 數位行銷分析與 Youtube API 教學
SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?