php设计模式
原型模式(prototype)
?
?
PHP設(shè)計(jì)模式之:原型模式
剛剛了解了原型模式,通過資料以及自身了解整合以下資料:
????原型模式通過復(fù)制已經(jīng)存在的實(shí)例來返回新的實(shí)例,而不是新建實(shí)例,并且原型(被復(fù)制的實(shí)例)是可定制的;原型模式多用于創(chuàng)建復(fù)雜的或耗時(shí)的實(shí)例,這種情況下,復(fù)制一個(gè)已經(jīng)存在的實(shí)例是程序運(yùn)行更高效無疑是一種好辦法;
概念:
????用原型實(shí)例創(chuàng)建對(duì)象的種類,并通過拷貝這些原型創(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ì)于全新的類來說較容易,但對(duì)已有的類進(jìn)行改造時(shí)將不是件容易的事情;
代碼實(shí)現(xiàn):
/1**/這些注釋的居然全沒了,糾結(jié)!!(就加個(gè)1吧)
<?php
/1**
?*?
?*?原型模式
?*?用原型實(shí)例指定創(chuàng)建對(duì)象的種類.并且通過拷貝這個(gè)原型來創(chuàng)建新的對(duì)象
?*?@author?lzs
?*?
?*/
?
?/1**
??*?
??*?聲明一個(gè)克隆自身的接口,即抽象原型角色
??*?@author?lzs
??*
??*/
?interface?Prototype
?{
??public?function?copy();
?}
?
/1**
?*?
?*?實(shí)現(xiàn)克隆自身的操作,具體原型角色
?*?@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**
?*?測(cè)試深拷貝的類
?*/?
?class?Test
?{
??public?$array;
?}
?
/1**
?*?
?*?客戶端
?*?@author?lzs
?*
?*/
?class?Client
?{
??/1**
???*?實(shí)現(xiàn)原型模式
???*?
???*?@return?string?取出數(shù)據(jù)
???*/
??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();
?
淺拷貝:
????被拷貝對(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è)界又將串行化這一過程形象的稱為“冷凍”或“腌咸菜”過程;
?
?
?
?
?
?
?
?
?
?
?
?
單例模式(singleton)
工廠模式(factory)
抽象工廠模式(abstruct factory)
工廠方法模式(factory_method)
??策略模式(strategy)
觀察者模式(observe)
?代理模式(proxy pattern)
?裝飾器模式(decorator)
建造者模式(build)
?適配器模式(adapter)
享元模式(flyweight)
解釋器模式(interpreter)
?
迭代器模式(iteration)
?
備忘錄模式(memento)
責(zé)任鏈模式(responsibility_chain)
狀態(tài)模式(state)
中介者模式(mediator)
外觀模式(結(jié)構(gòu)型facade)
命令模式(command)
橋接模式(bridge)
訪問者模式(visitor)
?
轉(zhuǎn)載于:https://www.cnblogs.com/xulei13140106/p/5946437.html
總結(jié)
- 上一篇: 安装VMWare tools,以及解决安
- 下一篇: [大数据之Spark]——Actions