原型模式的作用:对象克隆以避免创建对象时的消耗
特点:
- 与工厂模式类似,都是用来创建对象。
- 与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。
- 原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需要内存拷贝即可。
<?php // 原型模式 class Canvas { private $data; public function init($width = 20, $height = 10) { $data = []; for($i = 0; $i < $height; $i++) { for($j = 0; $j < $width; $j++) { $data[$i][$j] = '*'; } } $this->data = $data; } public function rect($x1, $y1, $x2, $y2) { foreach($this->data as $k1 => $line) { if ($x1 > $k1 or $x2 < $k1) { continue; } foreach($line as $k2 => $char) { if ($y1>$k2 or $y2<$k2) { continue; } $this->data[$k1][$k2] = '#'; } } } public function draw() { foreach ($this->data as $line){ foreach ($line as $char){ echo $char; } echo "<br>;"; } } } $c = new Canvas(); $c->init(); // / $canvas1 = new Canvas(); // $canvas1->init(); $canvas1 = clone $c;//通过克隆,可以省去init()方法 $canvas1->rect(2, 2, 8, 8); $canvas1->draw(); echo "-----------------------------------------<br>"; $canvas2 = clone $c; $canvas2->rect(1, 4, 8, 8); $canvas2->draw(); ?>