基本概念:
与工厂模式作用类似,都是用来创建对象。但与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过 clone 原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。
应用场景:
原型模式适用于大对象的创建。创建一个大对象需要很大的系统开销,如果每次使用new实例创建,就会消耗很大,原型模式仅需内存拷贝即可。
代码示例:
/** * 新建canvas类 * Class Canvas * @package Wecot */ class Canvas { public $data; function init($width = 30, $height = 15) { $data = []; for ($i = 0; $i < $height; $i++) { for ($j = 0; $j < $width; $j++) { $data[$i][$j] = '*'; } } $this->data = $data; } function draw() { foreach ($this->data as $heightArr) { foreach ($heightArr as $widthChar) { echo $widthChar; } echo PHP_EOL; } } function rect($a1, $a2, $b1, $b2) { foreach ($this->data as $k1 => $line) { if ($k1 < $a1 or $k1 > $a2) continue; foreach ($line as $k2 => $widthChar) { if ($k2 < $b1 or $k2 > $b2) continue; $this->data[$k1][$k2] = ' '; } } } }
传统调用方式:
//建立原型对象 $canvas1 = new \Wecot\Canvas(); $canvas1->init(); $canvas1->rect(3, 6,4,20); $canvas1->draw(); echo '======================================'.PHP_EOL; $canvas2 = new \Wecot\Canvas(); $canvas2->rect(3, 6,4,25); $canvas2->draw();
以上程序复杂度较高,因此带来的系统开销较大。使用原型模式利用只是在内存中进行对象拷贝操作,对比之下,颇有良效。
原型模式调用:
//建立原型对象 $prototype = new \Wecot\Canvas(); $prototype->init(); $canvas1 = clone $prototype; $canvas1->rect(3, 6,4,20); $canvas1->draw(); echo '======================================'.PHP_EOL; $canvas2 = clone $prototype; $canvas2->rect(3, 6,4,25); $canvas2->draw();
执行结果:
转载请注明:微刻 blog.wecot.cn » 设计模式之原型模式