1
PHP原型模式
Posted by 撒得一地 on 2016年2月23日 in PHP笔记
上一篇: PHP数据对象映射模式
下一篇: PHP观察者模式
下一篇: PHP观察者模式
PHP原型模式与工厂模式作用类似,都是用来创建对象的。与工厂模式的实现不同的是,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。
原型模式适用于大对象的创建。创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可。
原型模式通过复制已经存在的实例来返回新的实例,而不是新建实例,并且原型(被复制的实例)是可定制的;原型模式多用于创建复杂的或耗时的实例,这种情况下,复制一个已经存在的实例是程序运行更高效无疑是一种好办法。
原型模式UML图:
下面用原型模式实现一个画布实例:
class Canvas { public $data; protected $decorators = array(); //Decorator //初始化一个有'*'组成的正方形 function init($width = 20, $height = 10) { $data = array(); for($i = 0; $i < $height; $i++) { for($j = 0; $j < $width; $j++) { $data[$i][$j] = '*'; } } $this->data = $data; } //声明一个添加原型的方法 function addDecorator(DrawDecorator $decorator) { $this->decorators[] = $decorator; } function beforeDraw() { foreach($this->decorators as $decorator) { $decorator->beforeDraw(); } } function afterDraw() { $decorators = array_reverse($this->decorators); foreach($decorators as $decorator) { $decorator->afterDraw(); } } function draw() { $this->beforeDraw(); foreach($this->data as $line) { foreach($line as $char) { echo $char; } echo "<br />\n"; } $this->afterDraw(); } function rect($a1, $a2, $b1, $b2) { foreach($this->data as $k1 => $line) { if ($k1 < $a1 or $k1 > $a2) continue; foreach($line as $k2 => $char) { if ($k2 < $b1 or $k2 > $b2) continue; $this->data[$k1][$k2] = ' '; } } } }
$canvas1 = new Canvas(); $canvas1->init(); $canvas1->rect(3,6,4,12); $canvas1->draw();
假如现在要绘制两次图形,那么按照传统的方法就要new两次,如:
$canvas1 = new Canvas(); $canvas1->init(); $canvas1->rect(3,6,4,12); $canvas1->draw(); echo "................................<br/>"; $canvas2 = new Canvas(); $canvas2->init(); $canvas2->rect(1,3,2,6); $canvas2->draw();
而用原型模式就可以用clone方法,而不用new两次:
$prototype = new Canvas(); $prototype->init(); $canvas1 = clone $prototype $canvas1->rect(3,6,4,12); $canvas1->draw(); $canvas2 = clone $prototype $canvas2->rect(1,3,2,6); $canvas2->draw();
使用原型模式,只要去构建一个原型对象,让原型对象去操作一些初始化操作,参数设置等。然后直接用克隆的方法去实现不同的对象,再去操作不同的方法。这样避免了重复new生成对象,都要去初始化一些复杂的操作。
原型模式优点:
1、可以在运行时刻增加和删除产品
2、可以改变值或结构以指定新对象
3、减少子类的构造
4、用类动态配置应用
原型模式的缺点:
Prototype是的最主要的缺点就是每一个类必须包含一个克隆方法;
而且这个克隆方法需要对类的功能进行检测,这对于全新的类来说较容易,但对已有的类进行改造时将不是件容易的事情。
上一篇: PHP数据对象映射模式
下一篇: PHP观察者模式
下一篇: PHP观察者模式
1 Comment
好文章,支持博主