抽象工厂模式

抽象工厂模式,将相似对象归到同一个工厂进行生产,减少具体工厂数量。

还拿前一篇的例子来说:
如果需要生产的电视机分为:纯平与液晶;生产的电脑也分为:台式机和笔记本。
这样需要4个具体的类,对于标准工厂模式来说,也需要4个具体的子工厂。
但是,我们不想开设那么多子工厂。
因为纯平电视与液晶电视,都属于电视机;而台式机和笔记本,都属于电脑。
因此,我们还利用原有的两个子工厂:电视机工厂和电脑工厂即可。

在标准工厂模式中:
1、主工厂创建相应子工厂
2、主工厂通知子工厂创建具体商品
3、创建出的商品送回主工厂
4、用户到主工厂去取商品

而在抽象工厂模式中:
1、主工厂只负责创建具体需要的子工厂
2、用户通知子工厂生产相应商品
3、用户直接到子工厂去取商品

/** * 纯平电视机类 */ class TV_CRT{ public function __toString() { return '纯平电视机<br />'; } } /** * 液晶电视机类 */ class TV_LCD{ public function __toString() { return '液晶电视机<br />'; } } /** * 台式机电脑类 */ class PC_Desktop{ public function __toString() { return '台式机电脑<br />'; } } /** * 笔记本电脑类 */ class PC_Notebook{ public function __toString() { return '笔记本电脑<br />'; } } /** * 生产方法的抽象接口 */ interface ICreator{ function create($type); } /** * 电视机创建类(子工厂) * 实现生产接口 */ class TVCreator implements ICreator{ public function create($type) //参数为TV的具体类型 { switch($type) { case 'LCD': /* if(制作LCD的材料有货 == false) return false; */ break; case 'CRT': /* if(制作CRT的材料有货 == false) return false; */ break; } $goods = 'TV_'.$type; return new $goods; //制造具体商品 } } /** * 电脑创建类(子工厂) * 实现生产接口 */ class PCCreator implements ICreator{ public function create($type) //参数为PC的具体类型 { switch($type) { case 'Desktop': /* if(制作台式机的材料有货 == false) return false; */ break; case 'Notebook': /* if(制作笔记本的材料有货 == false) return false; */ break; } $goods = 'PC_'.$type; return new $goods; //制造具体商品 } } /** * 工厂创建类(主工厂) */ class FactoryCreator{ public function getCreator($type) { $gc = $type.'Creator';//先根据参数创建具体的子工厂 return new $gc; //返回子工厂对象 } } /** * 开始测试(用户) */ $fc = new FactoryCreator(); //创建主工厂 $tvc = $fc->getCreator('TV'); //用户通知主工厂创建电视机工厂 echo $tvc->create('LCD'); //用户通知电视机工厂生产液晶电视 $pcc = $fc->getCreator('PC'); //用户通知主工厂创建电脑工厂 echo $pcc->create('Notebook'); //用户通知电脑工厂生产笔记本电脑 /* 输出: 液晶电视机 笔记本电脑 */ 

关键点:主工厂只负责建造子工厂,它是工厂的工厂!

你可能感兴趣的:(function,制造,测试)