设计模式php实例:原型模式
2012-08-06 14:42
681 查看
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。它允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,其工作原理是通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口(from百度百科)。
原型模式对编程带来的最大好处是减少代码量的编写,间接好处是精简代码,结构清晰。
原型模式UML类图:
YII代码实例 :
由于对象在php中是以引用的方式调用的,所有在clone属性中有其他对象引用的时候要注意区分浅复制和深复制。
浅复制:clone出的新对象和源对象具有相同的引用
深复制:clone出的新对象和源对象的引用是不同的
如果对象引用里面还有引用,引用嵌套多层,如果向上吗要达到深复制的话,是不是每个里面都要加__clone方法呢(实际应用中出现这种情况其实要考虑用原型模式是不是合适了),其实可以用序列化方法。
原型模式对编程带来的最大好处是减少代码量的编写,间接好处是精简代码,结构清晰。
原型模式UML类图:
YII代码实例 :
class CActiveDataProvider extends CDataProvider { /** * Fetches the data from the persistent data storage. * @return array list of data items */ protected function fetchData() { $criteria=clone $this->getCriteria();//clone条件封装对象 if(($pagination=$this->getPagination())!==false) { $pagination->setItemCount($this->getTotalItemCount()); $pagination->applyLimit($criteria); } $baseCriteria=$this->model->getDbCriteria(false); if(($sort=$this->getSort())!==false) { // set model criteria so that CSort can use its table alias setting if($baseCriteria!==null) { $c=clone $baseCriteria; $c->mergeWith($criteria); $this->model->setDbCriteria($c); } else $this->model->setDbCriteria($criteria); $sort->applyOrder($criteria); } $this->model->setDbCriteria($baseCriteria!==null ? clone $baseCriteria : null); $data=$this->model->findAll($criteria); $this->model->setDbCriteria($baseCriteria); // restore original criteria return $data; } /** * Returns the query criteria. * @return CDbCriteria the query criteria */ public function getCriteria() { if($this->_criteria===null) $this->_criteria=new CDbCriteria; return $this->_criteria; } }
由于对象在php中是以引用的方式调用的,所有在clone属性中有其他对象引用的时候要注意区分浅复制和深复制。
浅复制:clone出的新对象和源对象具有相同的引用
class Object { public $attribute = 0; } class Source { public $obj; public function __construct($obj) { $this->obj = $obj; } } $innerObj = new Object(); $source = new Source($innerObj); $new = clone $source; var_dump (spl_object_hash($new->obj) === spl_object_hash($source->obj)); //true
深复制:clone出的新对象和源对象的引用是不同的
//添加__clone魔术方法 class Source { public $obj; public function __construct($obj) { $this->obj = $obj; } public function __clone() { $this->obj = clone $this->obj; } } $innerObj = new Object(); $source = new Source($innerObj); $new = clone $source; var_dump (spl_object_hash($new->obj) === spl_object_hash($source->obj));//false
如果对象引用里面还有引用,引用嵌套多层,如果向上吗要达到深复制的话,是不是每个里面都要加__clone方法呢(实际应用中出现这种情况其实要考虑用原型模式是不是合适了),其实可以用序列化方法。
class Object { public $attribute = 0; } class Source { public $obj; public function __construct($obj) { $this->obj = $obj; } } $innerObj = new Object(); $source = new Source($innerObj); $new = unserialize(serialize($source)); var_dump (spl_object_hash($new->obj) === spl_object_hash($source->obj));//false
相关文章推荐
- Net设计模式实例之原型模式( Prototype Pattern)
- php单态设计模式(单例模式)实例
- php设计模式 Prototype (原型模式)代码
- PHP设计模式之观察者模式实例
- PHP设计模式之原型模式定义与用法详解
- PHP设计模式(六)原型模式(Prototype For PHP)
- 设计模式--原型/外观(OC 实例)
- 慕课网----大话PHP设计模式 五(原型模式,装饰器模式,迭代器模式,代理模式)
- 23种设计模式C++实例之原型模式
- php设计模式 原型模式
- PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)
- PHP中的工厂设计模式【实例】
- [设计模式](四):建造者模式(Builder)与原型模式(Prototype)[含Kotlin深克隆实例代码]
- 初识PHP设计模式--原型模式
- PHP设计模式之装饰者模式代码实例
- PHP设计模式之工厂模式实例总结
- php设计模式学习系列(七)--原型对象
- PHP设计模式之原型模式详解
- php设计模式之单例模式实例分析
- 设计模式php实例:装饰者模式