原型模式同屬建立型模式,透過複製現有原型物件建立新實例,避免重複初始化開銷,適合大型物件或昂貴建構過程。
clone 關鍵字複製原型。clone 執行淺複製;若需深複製,實作 __clone() 魔術方法處理參考屬性。<?php
namespace Baobab;
class Canvas {
private $shapes = [];
public function init() {
// 昂貴初始化:載入資源、建立預設圖層等
$this->shapes = ['background' => 'white'];
}
public function rect($x, $y, $w, $h) {
$this->shapes[] = "rect($x,$y,$w,$h)";
}
public function draw() {
echo "Canvas: " . implode(', ', $this->shapes) . "\n";
}
// 若 $shapes 含有物件參考,需實作 __clone 深複製
}
// 使用
$prototype = new Baobab\Canvas();
$prototype->init();
$canvas1 = clone $prototype;
$canvas1->rect(3, 6, 4, 12);
$canvas1->draw();
$canvas2 = clone $prototype;
$canvas2->rect(10, 20, 5, 5);
$canvas2->draw();
Canvas: background=white, rect(3,6,4,12)
Canvas: background=white, rect(10,20,5,5)
clone 為淺複製,含有物件屬性時必須實作 __clone() 深複製。