標籤:
原型模式(prototype)
PHP設計模式之:原型模式
剛剛瞭解了原型模式,通過資料以及自身瞭解整合以下資料:
原型模式通過複製已經存在的執行個體來返回新的執行個體,而不是建立執行個體,並且原型(被複製的執行個體)是可定製的;原型模式多用於建立複雜的或耗時的執行個體,這種情況下,複製一個已經存在的執行個體是程式運行更高效無疑是一種好辦法;
概念:
用原型執行個體建立對象的種類,並通過拷貝這些原型建立的對象;
結構圖:
主要角色:
抽象原型角色(Prototype):聲明一個複製自身的介面
具體原型角色(ConcretePrototype):實現一個複製自身的操作
Prototype模式優點:
1、可以在運行時刻增加和刪除產品
2、可以改變值或結構以指定新對象
3、減少子類的構造
4、用類動態配置應用
Prototype模式的缺點:
Prototype是的最主要的缺點就是每一個類必須包含一個複製方法;
而且這個複製方法需要對類的功能進行檢測,這對於全新的類來說較容易,但對已有的類進行改造時將不是件容易的事情;
代碼實現:
/1**/這些注釋的居然全沒了,糾結!!(就加個1吧)
<?php
/1**
*
* 原型模式
* 用原型執行個體指定建立對象的種類.並且通過拷貝這個原型來建立新的對象
* @author lzs
*
*/
/1**
*
* 聲明一個複製自身的介面,即抽象原型角色
* @author lzs
*
*/
interface Prototype
{
public function copy();
}
/1**
*
* 實現複製自身的操作,具體原型角色
* @author lzs
*
*/
class ConcretePrototype implements Prototype
{
private $name;
function __construct($name)
{
$this->name = $name;
}
function getName()
{
return $this->name;
}
function setName($name)
{
$this->name = $name;
}
//複製
function copy()
{
/1**
* 淺拷貝
*/
//return clone $this;
/1**
* 深拷貝
*/
$serialize_obj = serialize($this); //序列化
$clone_obj = unserialize($serialize_obj); //還原序列化
return $clone_obj;
}
}
/1**
* 測試深拷貝的類
*/
class Test
{
public $array;
}
/1**
*
* 用戶端
* @author lzs
*
*/
class Client
{
/1**
* 實現原型模式
*
* @return string 取出資料
*/
public static function main()
{
/1**
* 淺拷貝
*/
// $pro = new ConcretePrototype(‘prototype‘);
// $pro2 = $pro->copy();
// echo ‘1:‘.$pro->getName().‘<br />2:‘.$pro2->getName();
/1**
* 深拷貝
*/
$test = new Test();
$test->array = array(‘1‘,‘2‘,‘3‘);
$pro1 = new ConcretePrototype($test);
$pro2 = $pro1->copy();
print_r($pro1->getName());
echo ‘<br />‘;
print_r($pro2->getName());
}
}
Client::main();
淺拷貝:
被拷貝對象的所有變數都含有與原對象相同的值,而且對其他對象的引用仍然是指向原來的對象。即淺拷貝只負責當前對象執行個體,對引用的對象不做拷貝。
深拷貝:
被拷貝對象的所有的變數都含有與原來對象相同的值,除了那些引用其他對象的變數。那些引用其他對象的變數將指向一個被拷貝的新對象,而不再是原有那些被引用對象。
即深拷貝把要拷貝的對象所引用的對象也都拷貝了一次,而這種對被引用到的對象拷貝叫做間接拷貝。深拷貝要深入到多少層,是一個不確定的問題。
在決定以深拷貝的方式拷貝一個對象的時候,必須決定對間接拷貝的對象是採取淺拷貝還是深拷貝還是繼續採用深拷貝。
因此,在採取深拷貝時,需要決定多深才算深。此外,在深拷貝的過程中,很可能會出現循環參考的問題。
利用序列化來做深拷貝:
利用序列化來做深拷貝,把對象寫到流裡的過程是序列化(Serilization)過程,但在業界又將序列化這一過程形象的稱為“冷凍”或“醃鹹菜”過程;
單例模式(singleton)
原廠模式(factory)
抽象原廠模式(abstruct factory)
Factory 方法模式(factory_method)
策略模式(
strategy
)
觀察者模式(
observe
)
代理模式(proxy pattern)
裝飾器模式(decorator)
建造者模式(build)
適配器模式(adapter)
享元模式(flyweight)
解譯器模式(interpreter)
迭代器模式(iteration)
備忘錄模式(memento)
責任鏈模式(responsibility_chain)
狀態模式(state)
中介者模式(mediator)
面板模式(結構型facade)
命令模式(command)
橋接模式(bridge)
訪問者模式(visitor)
php設計模式