欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)原型模式(prototype)

 更新時(shí)間:2015年12月07日 13:04:14   作者:胖胖  
這篇文章主要介紹了php設(shè)計(jì)模式中的原型模式,使用php實(shí)現(xiàn)原型模式,感興趣的小伙伴們可以參考一下

一、意圖
用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象
二、原型模式結(jié)構(gòu)圖

三、原型模式中主要角色
抽象原型(Prototype)角色:聲明一個(gè)克隆自身的接口

具體原型(Concrete Prototype)角色:實(shí)現(xiàn)一個(gè)克隆自身的操作

四、原型模式的優(yōu)點(diǎn)和缺點(diǎn)
Prototype模式優(yōu)點(diǎn)
1、可以在運(yùn)行時(shí)刻增加和刪除產(chǎn)品
2、可以改變值以指定新對(duì)象
3、可以改變結(jié)構(gòu)以指定新對(duì)象
4、減少子類的構(gòu)造
5、用類動(dòng)態(tài)配置應(yīng)用

Prototype模式的缺點(diǎn)
Prototype模式的最主要缺點(diǎn)就是每一個(gè)類必須配備一個(gè)克隆方法。
而且這個(gè)克隆方法需要對(duì)類的功能進(jìn)行通盤考慮,這對(duì)全新的類來說不是很難,但對(duì)已有的類進(jìn)行改造時(shí),不一定是件容易的事。

五、原型模式適用場(chǎng)景
1、當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時(shí),要使用Prototype模式
2、當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如動(dòng)態(tài)加載
3、為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平等的工廠類層次時(shí);
4、當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些

六、原型模式與其它模式

抽象工廠模式(abstract factory模式):Abstract Factory模式與Prototype模式在某種方面是相互競(jìng)爭的,但是也可以一起使用。

七、原型模式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() {
 /* 深拷貝實(shí)現(xiàn)
 $serialize_obj = serialize($this); // 序列化
 $clone_obj = unserialize($serialize_obj); // 反序列化       
 return $clone_obj;
 */
 return clone $this; // 淺拷貝
 }
}
 
/**
 * 測(cè)試深拷貝用的引用類
 */
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();
?>

補(bǔ)充:淺拷貝與深拷貝

淺拷貝
被拷貝對(duì)象的所有變量都含有與原對(duì)象相同的值,而且對(duì)其他對(duì)象的引用仍然是指向原來的對(duì)象。
即 淺拷貝只負(fù)責(zé)當(dāng)前對(duì)象實(shí)例,對(duì)引用的對(duì)象不做拷貝。

深拷貝
被拷貝對(duì)象的所有的變量都含有與原來對(duì)象相同的值,除了那些引用其他對(duì)象的變量。那些引用其他對(duì)象的變量將指向一個(gè)被拷貝的新對(duì)象,而不再是原有那些被引用對(duì)象。
即 深拷貝把要拷貝的對(duì)象所引用的對(duì)象也都拷貝了一次,而這種對(duì)被引用到的對(duì)象拷貝叫做間接拷貝。
深拷貝要深入到多少層,是一個(gè)不確定的問題。
在決定以深拷貝的方式拷貝一個(gè)對(duì)象的時(shí)候,必須決定對(duì)間接拷貝的對(duì)象是采取淺拷貝還是深拷貝還是繼續(xù)采用深拷貝。
因此,在采取深拷貝時(shí),需要決定多深才算深。此外,在深拷貝的過程中,很可能會(huì)出現(xiàn)循環(huán)引用的問題。

利用序列化來做深拷貝
利用序列化來做深拷貝,把對(duì)象寫到流里的過程是序列化(Serilization)過程,但在業(yè)界又將串行化這一過程形象的稱為“冷凍”或“腌咸菜”過程;而把對(duì)象從流中讀出來的過程則叫做反序列化(Deserialization)過程,也稱為“解凍”或“回鮮”過程。
在PHP中使用serializeunserialize函數(shù)實(shí)現(xiàn)序列化和反序列化。

在上面的代碼中的注釋就是一個(gè)先序列化再反序列化實(shí)現(xiàn)深拷貝的過程。

以上就是使用php實(shí)現(xiàn)原型模式的代碼,還有一些關(guān)于原型模式的概念區(qū)分,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評(píng)論