就是定義出一個prototype(原型),
然後利用這個原型,來產生物件。
產生的方式不同於Factory Pattern中使用的new,
而是利用clone(複製)。
因此,在介紹Prototype pattern之前,得先了解何謂clone。
clone範例程式
Clone看起來很簡單,要讓物件能夠被clone,
只要讓類別實作Clonable,
並override Object類別的clone method即可。
當你直接呼叫某某物件的clone()方法進行複製時,
除了會複製物件本身之外,
物件內的member field也會被一併複製。
如果member field是primitive type(原生資料型態),
例如整數,那就沒什麼問題。
但是!人生最無奈就是這個但是!
但是如果memer field是其他物件,如上例中的Flower時,
就須要考慮到是要shallow clone(淺層複製)或是deep clone(深層複製)。
讓我們以上例來說明shallow clone和deep clone。
shallow clone在複製Brick時,並不會複製Brick中的flower的instance,
對於Flower,只會複製其reference而已。
也就是說,brick1(被複製的物件)和brick2(複製的物件),共享brick1的flower。
如果要達到deep clone,那麼就必須在FragileBrick的clone方法中,
自行複製flower物件,如:
Prototype Pattern
簡單介紹完clone之後,開始介紹Prototype pattern。
(其實介紹完clone後,就幾乎會prototype pattern了)
本文一開始有提到,
prototype pattern是利用prototype class配合clone method來產生物件,
這聽起來和factory method pattern好像差不多,
但兩者在使用時機上有很大的差別。
如果物件的產生須要耗費許多系統的資源
(例如要從資料庫或檔案讀取資料,從而設定要產生的物件),
使用factory method pattern會在每次產生物件的時候,都佔用許多系統資源,
這時候若採用prototype pattern,
除了第一次產生物件時外,並不會耗用額外的系統資源。
Prototype Pattern範例程式
沒有留言:
張貼留言