用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。Prototype模式允許一個對象再創建另外一個可定制的對象,根本無需知道任何如何創建的細節,通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。它主要面對的問題是:“某些結構復雜的對象”的創建工作;由於需求的變化,這些對象經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的接口。
在php中,類已經實現了原型模式,php有個魔術方法__clone()方法,會克隆出一個這樣的對象。
看一下UML類圖:
角色分析:
1.抽象原型,提供了一個克隆的接口
2.具體的原型,實現克隆的接口
具體的代碼:
/**抽象原型類 * Class Prototype */ abstract class Prototype { abstract function cloned(); } /**具體原型類 * Class Plane */ class Plane extends Prototype { public $color; function Fly() { echo 飛機飛啊飛! ; } function cloned() { return clone $this; } }
客戶端測試代碼:
header(Content-Type:text/html;charset=utf-8); //------------------------原型模式測試代碼------------------ require_once ./Prototype/Prototype.php; $plane1=new Plane(); $plane1->color=Blue; $plane2=$plane1->cloned(); $plane1->Fly(); $plane2->Fly(); echo plane1的顏色為:{$plane1->color} ; echo plane2的顏色為:{$plane2->color} ;