這篇文章帶給大家的內容是關於php原型模式的實作方法及介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
用原型實例指定創建物件的種類,並且透過拷貝這些原型創建新的物件
的平行繼承層次的出現是工廠方法模式帶來的一個問題。這是一種讓一些程式設計師不舒服的耦合。每次添加產品家族時,你就被迫去創建一個相關的具體創建者。在一個快速成長的系統裡會包含越來越多的產品,而維護這種關係便會很快令人厭煩。
避免這種依賴的辦法是使用PHP的 clone關鍵字複製已存在的具體產品,然後,具體產品類本身便成為它們自己生成的基礎。這使是原型模式。使用該模式我們可以用組合取代繼承。這樣的轉變則促進了程式碼運行時的靈活性,並減少了必須創建的類別的數。
假設有一款「文明」( Civilization)風格的網路遊戲,可在區塊組成的格子中操作戰鬥單元(unit)。每個區塊分別代表海洋、平原和森林。地形的類別約束了佔有區塊的單元的格鬥能力。我們可以有一個 errainFactory物件來提供Sea、 Forest和 Plains.物件,我們決定允許使用者在完全不同的環境裡選擇,於是Sea可能是 Marssea和 Earthsea的抽象父類。 Forest(森林)和P1ains(平原)物件也會有相似的實作。這裡的分支便構成了抽象工廠模式。我們有截然不同的產品體系(Sea、 Plains、 Forests),而這些產品家族間有超越繼承的緊密聯繫,如 Earth(地球)和Mars(火星),它們都同時存在海洋、森林和平原地形。圖9-10所示的類別圖展示如何對這些產品應用抽象工廠和工廠方法模式。
你可以看到,我們依賴繼承來組合工廠生成的terrain(地形)家族產品,這的確是一個可行的解決方案,但這需要有一個大型的繼承體系,並且相對來說不那麼靈活。當你不想要平行的整合體係而需要最大化運行時的靈活性,可以使用抽象工廠模式的強大變形一原型模式
<?php //海洋 class Sea{ //可导航性 private $navigability=0; function __construct($navigability){ $this->navigability=$navigability; } } //地球海洋 class EarthSea extends Sea{} //火星海洋 class MarsSea extends Sea{} //平原 class Plains{} //地球平原 class EarthPlains extends Plains{} //火星平原 class MarsPlains extends Plains{} //森岭 class Forest{} //地球森林 class EarthForest extends Forest{} //火星森林 class MarsForest extends Forest{} //地形工厂 class TerrainFactory{ private $sea; private $forest; private $plains; function __construct(Sea $sea,Plains $plains,Forest $forest){ $this->sea=$sea; $this->plains=$plains; $this->forest=$forest; } function getSea(){ return clone $this->sea; } function getPlains(){ return clone $this->plains; } function getForest(){ return clone $this->forest; } } class Contained{} class Container{ public $contained; function __construct(){ $this->contained=new Contained(); } function __clone(){ //确保被克隆的对象持有的是self::$contained的克隆而不是引用 $this->contained=clone $this->contained; } } $factory=new TerrainFactory(new EarthSea(-1), new EarthPlains(), new EarthForest()); print_r($factory->getSea()); print "<hr>"; print_r($factory->getPlains()); print "<hr>"; print_r($factory->getForest());
輸出結果:
EarthSea Object ( [navigability:Sea:private] => -1 )
EarthPlains Object ( )
#EarthForest Object ( )
以上是php原型模式的實作方法及介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!