Prototype Pattern
當創建實例的過程很昂貴或複雜時,透過拷貝這些原型來建立新的實例。
Example: 三隻小豬
原型模式中會將類別分為兩類:
分別是原型介面 (Prototype) 及 具體原型類別 (Concrete Prototype) 。
透過原型介面,我們可以知道該實例能拷貝 (clone) ,複製出自己的實例。
其中拷貝又可分為兩種:
分別是淺複製 (Shallow Copy) 與 深複製 (Deep Copy) 。
兩者的差別在於,當原型類別的屬性為參考類型 (references) 時,
淺複製會指向與實例一樣的位址,不會重新創建屬性。
深複製則會重新創建屬性。
這意味著,當使用淺複製時,
修改參考類型的屬性會一併修改到原本實例。
優點:
可以直接拷貝實例,省去創建的麻煩。
也提供了一個不使用繼承 (extend) 來面對複雜實例的方式。
缺點:
當架構較為複雜時,深複製可能會不好實作。
與其他模式的比較:
[抽象工廠模式]:
抽象工廠模式,透過定義產品族的概念,處理複雜的創建。
原型模式則是想利用拷貝的概念,來處理複雜的創建。
[單例模式]:
單例模式保證同一時間存在一個實例。
原型模式則是複製出一個實例。
ʕ •ᴥ•ʔ:在PHP中,由於有魔術方法__clone()的存在,
我們可以不定義原型介面,直接使用clone()。