剛剛了解了原型模式,通過(guò)資料以及自身了解整合以下資料:
原型模式通過(guò)復(fù)制已經(jīng)存在的實(shí)例來(lái)返回新的實(shí)例,而不是新建實(shí)例,并且原型(被復(fù)制的實(shí)例)是可定制的;原型模式多用于創(chuàng)建復(fù)雜的或耗時(shí)的實(shí)例,這種情況下,復(fù)制一個(gè)已經(jīng)存在的實(shí)例是程序運(yùn)行更高效無(wú)疑是一種好辦法;
概念:
用原型實(shí)例創(chuàng)建對(duì)象的種類,并通過(guò)拷貝這些原型創(chuàng)建的對(duì)象;
結(jié)構(gòu)圖:
主要角色:
抽象原型角色(Prototype):聲明一個(gè)克隆自身的接口
具體原型角色(ConcretePrototype):實(shí)現(xiàn)一個(gè)克隆自身的操作
Prototype模式優(yōu)點(diǎn):
1、可以在運(yùn)行時(shí)刻增加和刪除產(chǎn)品
2、可以改變值或結(jié)構(gòu)以指定新對(duì)象
3、減少子類的構(gòu)造
4、用類動(dòng)態(tài)配置應(yīng)用
Prototype模式的缺點(diǎn):
Prototype是的最主要的缺點(diǎn)就是每一個(gè)類必須包含一個(gè)克隆方法;
而且這個(gè)克隆方法需要對(duì)類的功能進(jìn)行檢測(cè),這對(duì)于全新的類來(lái)說(shuō)較容易,但對(duì)已有的類進(jìn)行改造時(shí)將不是件容易的事情;
代碼實(shí)現(xiàn):
/1**/這些注釋的居然全沒(méi)了,糾結(jié)!!(就加個(gè)1吧)
<?php
/1**
*
*原型模式
*用原型實(shí)例指定創(chuàng)建對(duì)象的種類.并且通過(guò)拷貝這個(gè)原型來(lái)創(chuàng)建新的對(duì)象
*@authorlzs
*
*/
/1**
*
*聲明一個(gè)克隆自身的接口,即抽象原型角色
*@authorlzs
*
*/
interfacePrototype
{
publicfunctioncopy();
}
/1**
*
*實(shí)現(xiàn)克隆自身的操作,具體原型角色
*@authorlzs
*
*/
classConcretePrototypeimplementsPrototype
{
private$name;
function__construct($name)
{
$this->name=$name;
}
functiongetName()
{
return$this->name;
}
functionsetName($name)
{
$this->name=$name;
}
//克隆
functioncopy()
{
/1**
*淺拷貝
*/
//returnclone$this;
/1**
*深拷貝
*/
$serialize_obj=serialize($this);//序列化
$clone_obj=unserialize($serialize_obj);//反序列化
return$clone_obj;
}
}
/1**
*測(cè)試深拷貝的類
*/
classTest
{
public$array;
}
/1**
*
*客戶端
*@authorlzs
*
*/
classClient
{
/1**
*實(shí)現(xiàn)原型模式
*
*@returnstring取出數(shù)據(jù)
*/
publicstaticfunctionmain()
{
/1**
*淺拷貝
*/
// $pro=newConcretePrototype('prototype');
// $pro2=$pro->copy();
// echo'1:'.$pro->getName().'<br/>2:'.$pro2->getName();
/1**
*深拷貝
*/
$test=newTest();
$test->array=array('1','2','3');
$pro1=newConcretePrototype($test);
$pro2=$pro1->copy();
print_r($pro1->getName());

echo'<br/>';
print_r($pro2->getName());
}
}
Client::main();
淺拷貝:
被拷貝對(duì)象的所有變量都含有與原對(duì)象相同的值,而且對(duì)其他對(duì)象的引用仍然是指向原來(lái)的對(duì)象。即淺拷貝只負(fù)責(zé)當(dāng)前對(duì)象實(shí)例,對(duì)引用的對(duì)象不做拷貝。
深拷貝:
被拷貝對(duì)象的所有的變量都含有與原來(lái)對(duì)象相同的值,除了那些引用其他對(duì)象的變量。那些引用其他對(duì)象的變量將指向一個(gè)被拷貝的新對(duì)象,而不再是原有那些被引用對(duì)象。
即深拷貝把要拷貝的對(duì)象所引用的對(duì)象也都拷貝了一次,而這種對(duì)被引用到的對(duì)象拷貝叫做間接拷貝。深拷貝要深入到多少層,是一個(gè)不確定的問(wèn)題。
在決定以深拷貝的方式拷貝一個(gè)對(duì)象的時(shí)候,必須決定對(duì)間接拷貝的對(duì)象是采取淺拷貝還是深拷貝還是繼續(xù)采用深拷貝。
因此,在采取深拷貝時(shí),需要決定多深才算深。此外,在深拷貝的過(guò)程中,很可能會(huì)出現(xiàn)循環(huán)引用的問(wèn)題。
利用序列化來(lái)做深拷貝:
利用序列化來(lái)做深拷貝,把對(duì)象寫(xiě)到流里的過(guò)程是序列化(Serilization)過(guò)程,但在業(yè)界又將串行化這一過(guò)程形象的稱為“冷凍”或“腌咸菜”過(guò)程;
愛(ài)華網(wǎng)本文地址 » http://www.klfzs.com/a/25101017/354530.html
愛(ài)華網(wǎng)



