Php设计模式之工厂模式(三)【抽象工厂模式 AbstractFactory】

来源:互联网 发布:ip网络广播系统设计厂 编辑:程序博客网 时间:2024/06/05 22:52

【案例】

承接上一篇工厂方法模式。由于市场需求变化,客户对猪产生兴趣,黑枣克隆公司不能不扩张生产线,以生产猪。

【分析OOA

工厂方法模式为狗族提供了统一的创建接口。当有多个产品族时,可以使用抽象工厂模式。

【设计OOD】

<UML>


<说明>

看看抽象工厂模式的各个角色(和工厂方法的如出一辙):

1、抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口。通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。

2、具体工厂(Concrete Factory)角色:实现创建产品对象的操作。客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。

3、抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

4、具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。其内部包含了应用程序的业务逻辑。编程 OOP:

代码

interface AnimalFactory{    public function createDog($color);    public function createPig($color);}class BigAnimalFactory implements AnimalFactory{    public function createDog($color)    {        $dogtype = ucfirst(strtolower($color)) . 'BigDog';        if (class_exists($dogtype)) {            return new $dogtype();        }    }    public function createPig($color)    {        $pigtype = ucfirst(strtolower($color)) . 'BigPig';        if (class_exists($pigtype)) {            return new $pigtype();        }    }}class SmallAnimalFactory implements AnimalFactory{    public function createDog($color)    {        $dogtype = ucfirst(strtolower($color)) . 'SmallDog';        if (class_exists($dogtype)) {            return new $dogtype();        }    }    public function createPig($color)    {        $pigtype = ucfirst(strtolower($color)) . 'SmallPig';        if (class_exists($pigtype)) {            return new $pigtype();        }    }}interface Dog{    public function shout();}class BlackBigDog implements Dog{    public function shout()    {        echo "BlackBigDog Wao!Wao!Wao! \n";    }}class BlackSmallDog implements Dog{    public function shout()    {        echo "BlackSmallDog Wao!Wao!Wao! \n";    }}interface Pig{    public function shout();}class BlackSmallPig implements Pig{    public function shout()    {        echo "BlackSmall Zhi!Zhi!Zhi! \n";    }}class BlackBigPig implements Pig{    public function shout()    {        echo "BlackGigPig  Zhi!Zhi!Zhi! \n";    }}


【测试用例Test Case】

<代码>

class testDriver{    public function run()    {        $bigfactory = new BigAnimalFactory();        $dog1 = $bigfactory->createDog('black');        $dog1->shout();        $pig1 = $bigfactory->createPig('black');        $pig1->shout();        $smallfactory = new SmallAnimalFactory();        $dog2 = $smallfactory->createDog('black');        $dog2->shout();        $pig2 = $smallfactory->createPig('black');        $pig2->shout();    }}

输出


【小结】

抽象工厂方法经常心工厂方法方式实现,抽象工厂的任务是定义一个负责创建一系列产品的接口。这个接口内每一个方法负责创建一个具体实例。

1、工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象

2、抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中

3、抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上,抽象工厂负责创建多个相关族产品,而工厂方法模式只用于单一族产品。


********************************************

* 作者:叶文涛 

* 标题:

Php设计模式之工厂模式(三)【抽象工厂模式 AbstractFactory

* 参考:

* 《Head First设计模式》Eric Freeman等著

*《PHP高级程序设计:模式、框架和测试》 Kevin McArthur 著 汪泳 等译

******************转载请注明来源 ***************


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 安卓版泰拉瑞亚联机失去连接怎么办 吃鸡安装不了怎么办 obb文件丢失了怎么办 dnf登录闪退怎么办 泰拉瑞亚地图找不到备份怎么办 服务器没远程管理卡怎么办 tplink上不了网怎么办 键盘端口坏了怎么办 小米路由dns错误怎么办 电脑内存性能低怎么办 nas硬盘坏了怎么办 360安装环境异常怎么办 连接不上服务器怎么办 路由器被绑定mac怎么办 mac地址绑定失败怎么办 触摸屏忘了密码怎么办? 小区高层水压低怎么办 高层楼房水压不够怎么办 热水器温度太高怎么办 热水器出热水小怎么办 天然气热水器水压不够怎么办 热水器水变小了怎么办 液压齿轮泵没力怎么办 gps总是浮点解怎么办 电源要做到稳压怎么办 变压器输出电压低怎么办 变压器输出电压高怎么办 家里空调带不动怎么办 小天才定位不准怎么办 伐木锯链条不出油怎么办 角磨机切割片卸不下来怎么办 油泵电机声音大怎么办 汽车油泵声音大怎么办 水泵电机噪音大怎么办 注塑机油泵超载怎么办 模具老是粘模怎么办 打印机提示卡纸2怎么办 扬子空调显示e9怎么办 供应商不配合售后怎么办? 数控车床显示屏不亮怎么办? 西威变频器过载怎么办