問題php
在大型應用中,須要工廠來生產一組相關實現的架構架構
umlthis
代碼編碼
<?php /* abstractFactory.php 抽象工廠模式產生一組相關的類 */ abstract class CommonManager{ abstract function getHeaderText(); //抽象工廠方法 abstract function getApptEncoder(); //抽象工廠方法 abstract function getTtdEncoder(); //抽象工廠方法 abstract function getContactEncoder(); abstract function getFooterText(); } class BlogsCommonManager extends CommonManager{ function getHeaderText(){ return "BlogsCal header\n"; } //獲取blogs格式的預定對象 function getApptEncoder(){ return new BlogsApptEncoder(); } //獲取blogs格式的待辦事宜對象 function getTtdEncoder(){ return new BlogsTtdEncoder(); } //獲取blogs格式的聯繫人對象 function getContactEncoder(){ return new BlogsContactEncoder(); } function getFooterText(){ return "BlosCal footer\n"; } } abstract class ApptEncoder{ abstract function encoder(); } class BlogsApptEncoder extends ApptEncoder{ function encoder(){ return "Blogs Appt encoder"; } } abstract class TtdEncoder{ abstract function encoder(); } class BlogsTtdEncoder extends TtdEncoder{ function encoder(){ return "Blogs Ttd encoder"; } } abstract class ContactEncoder{ abstract function encoder(); } class BlogsContactEncoder extends ContactEncoder{ function encoder(){ return "Blogs Contact encoder"; } } $BlogsCommonManager = new BlogsCommonManager(); //create ApptEncoder obj $BlogsCommonManager->getApptEncoder(); //create TtdEncoder obj $BlogsCommonManager->getTtdEncoder(); //create ContactEncoder obj $BlogsCommonManager->getTtdEncoder(); ?>
結果spa
將系統與實現的細節分開,能夠在示例中添加或刪除任意數目的編碼風格而不會影響系統prototype
對系統中功能相關的的元素強制進行組合。所以經過使用Blogscommonmanager能夠確保只使用與BlogsCal相關的類rest
添加新產品很是麻煩,不只要建立新產品的具體實現,並且爲了支持它,還必須修改抽象建立者和它的每個具體實現code
原型模式對象
問題blog
平行繼承層次的出現時工廠方法模式帶來的一個問題,這是一種耦合,每次添加產品家族時,你被迫去建立相關的具體建立者(好比編碼器BlogsCal和BlogsCommonManager)
實現
建立一個保存具體產品的工廠類,並在初始化時就加入產品,這樣減小類的數量
代碼實現
<?php /* prototype.php */ class Sea{ private $navigability = 0; function __construct($navigability){ $this->navigability = $navigability; } function __set($pro,$vaue){ $this->$pro = $vaue; } } 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{} //帶有產品對象實例的具體的TerrainFactory對象 class TerrainFactory{ private $sea; private $plains; private $forest; 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; } } //client $factory = new TerrainFactory(new EarthSea(-1),new MarsPlains(),new EarthForest()); $sea1 = $factory->getSea(); $sea2 = $factory->getSea(); $sea1->navigability = 1; $sea2->navigability = 2; print_r($sea1); print_r($sea2); ?>