一、意圖
用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象
二、原型模式結構圖
三、原型模式中主要角色
抽象原型(Prototype)角色:聲明一個克隆自身的接口
具體原型(Concrete Prototype)角色:實現一個克隆自身的操作
四、原型模式的優點和缺點
Prototype模式優點:
1、可以在運行時刻增加和刪除產品
2、可以改變值以指定新對象
3、可以改變結構以指定新對象
4、減少子類的構造
5、用類動態配置應用
Prototype模式的缺點:
Prototype模式的最主要缺點就是每一個類必須配備一個克隆方法。
而且這個克隆方法需要對類的功能進行通盤考慮,這對全新的類來說不是很難,但對已有的類進行改造時,不一定是件容易的事。
五、原型模式適用場景
1、當一個系統應該獨立於它的產品創建、構成和表示時,要使用Prototype模式
2、當要實例化的類是在運行時刻指定時,例如動態加載
3、為了避免創建一個與產品類層次平等的工廠類層次時;
4、當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型並克隆它們可能比每次用合適的狀態手工實例化該類更方便一些
六、原型模式與其它模式
抽象工廠模式(abstract factory模式):Abstract Factory模式與Prototype模式在某種方面是相互競爭的,但是也可以一起使用。
七、原型模式PHP示例
<?php /** * 抽象原型角色 */ interface Prototype { public function copy(); } /** * 具體原型角色 */ class ConcretePrototype implements Prototype{ private $_name; public function __construct($name) { $this->_name = $name; } public function setName($name) { $this->_name = $name; } public function getName() { return $this->_name; } public function copy() { /* 深拷貝實現 $serialize_obj = serialize($this); // 序列化 $clone_obj = unserialize($serialize_obj); // 反序列化 return $clone_obj; */ return clone $this; // 淺拷貝 } } /** * 測試深拷貝用的引用類 */ class Demo { public $array; } class Client { /** * Main program. */ public static function main() { $demo = new Demo(); $demo->array = array(1, 2); $object1 = new ConcretePrototype($demo); $object2 = $object1->copy(); var_dump($object1->getName()); echo '<br />'; var_dump($object2->getName()); echo '<br />'; $demo->array = array(3, 4); var_dump($object1->getName()); echo '<br />'; var_dump($object2->getName()); echo '<br />'; } } Client::main(); ?>
補充:淺拷貝與深拷貝
淺拷貝
被拷貝對象的所有變量都含有與原對象相同的值,而且對其他對象的引用仍然是指向原來的對象。
即 淺拷貝只負責當前對象實例,對引用的對象不做拷貝。
深拷貝
被拷貝對象的所有的變量都含有與原來對象相同的值,除了那些引用其他對象的變量。那些引用其他對象的變量將指向一個被拷貝的新對象,而不再是原有那些被引用對象。
即 深拷貝把要拷貝的對象所引用的對象也都拷貝了一次,而這種對被引用到的對象拷貝叫做間接拷貝。
深拷貝要深入到多少層,是一個不確定的問題。
在決定以深拷貝的方式拷貝一個對象的時候,必須決定對間接拷貝的對象是采取淺拷貝還是深拷貝還是繼續采用深拷貝。
因此,在采取深拷貝時,需要決定多深才算深。此外,在深拷貝的過程中,很可能會出現循環引用的問題。
利用序列化來做深拷貝
利用序列化來做深拷貝,把對象寫到流裡的過程是序列化(Serilization)過程,但在業界又將串行化這一過程形象的稱為“冷凍”或“腌鹹菜”過程;而把對象從流中讀出來的過程則叫做反序列化(Deserialization)過程,也稱為“解凍”或“回鮮”過程。
在PHP中使用serialize和unserialize函數實現序列化和反序列化。
在上面的代碼中的注釋就是一個先序列化再反序列化實現深拷貝的過程。
以上就是使用php實現原型模式的代碼,還有一些關於原型模式的概念區分,希望對大家的學習有所幫助。