學習php設計模式 php實現(xiàn)原型模式(prototype)
一、意圖
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象
二、原型模式結(jié)構(gòu)圖

三、原型模式中主要角色
抽象原型(Prototype)角色:聲明一個克隆自身的接口
具體原型(Concrete Prototype)角色:實現(xiàn)一個克隆自身的操作
四、原型模式的優(yōu)點和缺點
Prototype模式優(yōu)點:
1、可以在運行時刻增加和刪除產(chǎn)品
2、可以改變值以指定新對象
3、可以改變結(jié)構(gòu)以指定新對象
4、減少子類的構(gòu)造
5、用類動態(tài)配置應用
Prototype模式的缺點:
Prototype模式的最主要缺點就是每一個類必須配備一個克隆方法。
而且這個克隆方法需要對類的功能進行通盤考慮,這對全新的類來說不是很難,但對已有的類進行改造時,不一定是件容易的事。
五、原型模式適用場景
1、當一個系統(tǒng)應該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時,要使用Prototype模式
2、當要實例化的類是在運行時刻指定時,例如動態(tài)加載
3、為了避免創(chuàng)建一個與產(chǎn)品類層次平等的工廠類層次時;
4、當一個類的實例只能有幾個不同狀態(tài)組合中的一種時。建立相應數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些
六、原型模式與其它模式
抽象工廠模式(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() {
/* 深拷貝實現(xiàn)
$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();
?>
補充:淺拷貝與深拷貝
淺拷貝
被拷貝對象的所有變量都含有與原對象相同的值,而且對其他對象的引用仍然是指向原來的對象。
即 淺拷貝只負責當前對象實例,對引用的對象不做拷貝。
深拷貝
被拷貝對象的所有的變量都含有與原來對象相同的值,除了那些引用其他對象的變量。那些引用其他對象的變量將指向一個被拷貝的新對象,而不再是原有那些被引用對象。
即 深拷貝把要拷貝的對象所引用的對象也都拷貝了一次,而這種對被引用到的對象拷貝叫做間接拷貝。
深拷貝要深入到多少層,是一個不確定的問題。
在決定以深拷貝的方式拷貝一個對象的時候,必須決定對間接拷貝的對象是采取淺拷貝還是深拷貝還是繼續(xù)采用深拷貝。
因此,在采取深拷貝時,需要決定多深才算深。此外,在深拷貝的過程中,很可能會出現(xiàn)循環(huán)引用的問題。
利用序列化來做深拷貝
利用序列化來做深拷貝,把對象寫到流里的過程是序列化(Serilization)過程,但在業(yè)界又將串行化這一過程形象的稱為“冷凍”或“腌咸菜”過程;而把對象從流中讀出來的過程則叫做反序列化(Deserialization)過程,也稱為“解凍”或“回鮮”過程。
在PHP中使用serialize和unserialize函數(shù)實現(xiàn)序列化和反序列化。
在上面的代碼中的注釋就是一個先序列化再反序列化實現(xiàn)深拷貝的過程。
以上就是使用php實現(xiàn)原型模式的代碼,還有一些關于原型模式的概念區(qū)分,希望對大家的學習有所幫助。
相關文章
靜態(tài)html文件執(zhí)行php語句的方法(推薦)
下面小編就為大家?guī)硪黄o態(tài)html文件執(zhí)行php語句的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
php通過ksort()函數(shù)給關聯(lián)數(shù)組按照鍵排序的方法
這篇文章主要介紹了php通過ksort()函數(shù)給關聯(lián)數(shù)組按照鍵排序的方法,實例分析了php中ksort()函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03
PHP過濾器 filter_has_var() 函數(shù)用法實例分析
這篇文章主要介紹了PHP過濾器 filter_has_var() 函數(shù)用法,結(jié)合實例形式分析了PHP過濾器 filter_has_var() 函數(shù)基本功能、原理、用法及操作注意事項,需要的朋友可以參考下2020-04-04

