php设计模式
原型模式(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_method)
??策略模式(strategy)
觀察者模式(observe)
?代理模式(proxy pattern)
?裝飾器模式(decorator)
建造者模式(build)
?適配器模式(adapter)
享元模式(flyweight)
解釋器模式(interpreter)
?
迭代器模式(iteration)
?
備忘錄模式(memento)
責任鏈模式(responsibility_chain)
狀態模式(state)
中介者模式(mediator)
外觀模式(結構型facade)
命令模式(command)
橋接模式(bridge)
訪問者模式(visitor)
?
轉載于:https://www.cnblogs.com/xulei13140106/p/5946437.html
總結
- 上一篇: 安装VMWare tools,以及解决安
- 下一篇: 又到了遮不住肉的季节了?