2013年3月13日 星期三

Prototype


目的

Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.
(制訂可用原型個體生成的物件類型,爾後只需複製此原型即可生成新物件。[1])

Prototype 是一個生成模式,與 Builder、Factory 系列生成模式不同的地方在於來源不同
Builder、Factory 系列這兩個都是從無到有,創造新的物件
然而 Prototype 則是會先有一個建立好的樣板,當有需要時便複製一份
複製的好處便是可以很輕易地產生一個新物件,成本相對於創造新物件還來得低

提到複製,不得不提到淺層複製 (Shallow Copy) 與深層複製 (Deep Copy)  [2]:

  • 淺層複製 (Shallow Copy):複製物件的參考,效率較高,一個物件的屬性被改,另一個也會被改
  • 深層複製 (Deep Copy):完完整整的複製整個物件

若想知道更多可以參考維基百科:Object  copy

Prototype 的 UML Class Diagram:

範例程式:
範例程式與 Class Diagram 的對應關係:
  • Client <==> Canvas
  • Prototype <==> BasicShapes
  • ConcretePrototype1 <==> Circle
  • ConcretePrototype2 <==> Rectangle

上面所提供的範例程式皆為淺層複製的版本
有興趣的讀者可以試試看改成深層複製版本
至於什麼時機用哪個版本,端看使用情況而定
如果需要讓每個複製的物件彼此獨立時,就要用深層複製,否則單純使用淺層複製即可


[1] "物件導向設計模式", Gamma, Johnson, Helm, Vlissides 著, 葉秉哲譯
[2] "Prototype:物件原型複製者", 猴子靈藥, http://blog.monkeypotion.net/gameprog/pattern/prototype-pattern