原型模式 - Prototype Pattern
定義
用原型例項來確定要建立物件的型別,並透過複製原型來建立新的物件。
結構中包含的角色
- Prototype(抽象原型角色):宣告一個克隆自身的介面
- Concrete Prototype(具體原型角色):實現一個克隆自身的操作
最小可表達程式碼
interface Cloneable
{
public function copy();
public function deepCopy();
}
class ConcreteCloneable
{
public function copy()
{
return clone $this;
}
public function deepCopy()
{
return unserialize(serialize($this));
}
}
一句話概括設計模式
克隆物件。
設計的原則和思想
克隆物件。
優點
- 當建立新的物件例項較為複雜時,使用原型模式可以簡化物件的建立過程。
- 逃避建構函式的約束。
- 深克隆儲存物件的狀態,可以實現狀態模式。
缺點
- 每一個類都需要一個克隆方法,程式碼沒法重用。
- 克隆包含迴圈引用的複雜物件會非常麻煩。
何時使用
- 建立一個物件的成本較高。
- 一個物件,多個呼叫者的場景。
實際應用場景
- Laravel 裡面的Builder複製。
- JAVA 中的 Object clone() 方法。
- 電腦上的複製(Ctrl + C)和貼上(Ctrl + V)操作。
淺複製與深複製
淺複製 : 被複製物件的所有變數都含有與原物件相同的值,而且對其他物件的引用仍然是指向原來的物件。
深複製 : 完整複製一個物件。深複製把要複製的物件所引用的物件也複製了一次。可以使用序列化來做深複製。
本作品採用《CC 協議》,轉載必須註明作者和本文連結