生成对象---抽象工厂
问题
在大型应用中,需要工厂来生产一组相关实现的架构
uml
代码
<?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(); ?>
结果
将系统与实现的细节分开,可以在示例中添加或删除任意数目的编码风格而不会影响系统
对系统中功能相关的的元素强制进行组合。因此通过使用Blogscommonmanager可以确保只使用与BlogsCal相关的类
添加新产品非常麻烦,不仅要创建新产品的具体实现,而且为了支持它,还必须修改抽象创建者和它的每一个具体实现
原型模式
问题
平行继承层次的出现时工厂方法模式带来的一个问题,这是一种耦合,每次添加产品家族时,你被迫去创建相关的具体创建者(比如编码器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); ?>