工厂模式中的每一个形态都是针对一定问题的办理方案,工厂方法针对的是多个产品系列构造;而抽象工厂模式针对的是多个产品族构造,一个产品族内有多个产品系列。
UML图
该模式中包含的角色及其职责

抽象工厂模式中存在四种角色,分别是抽象工厂角色,详细工厂角色,抽象产品角色,详细产品角色。
抽象工厂角色:担当这个角色的是工厂方法模式的核心,它是与运用系统商业逻辑无关的。详细工厂角色:这个角色直接在客户真个调用下创建产品的实例。这个角色含有选择得当的产品工具的逻辑,而这个逻辑是与运用系统的商业逻辑紧密干系的。抽象产品角色:担当这个角色的类是工厂方法模式所创建的工具的父类,或它们共同拥有的接口。详细产品角色:抽象工厂模式所创建的任何产品工具都是某一个详细产品类的实例。这是客户端终极须要的东西,其内部一定充满了运用系统的商业逻辑。在本文例子表示
从接口上来看跟工厂方法模式是不是有点像呢?没错他们便是很像,只不过工厂方法一个工厂仅针对一个产品,而抽象工厂模式一个工厂对应多个产品。
例如:工厂方法模式便是一家公司只生产一种产品,抽象工厂模式一家公司生产多种产品。
产品构造图表格描述
在这里阿里和腾讯分别是两家不同的公司,但是他们都有拥有多个产品。
紧张办理的问题
抽象工厂模式的一个紧张功能是它能够隔离要天生的详细产品类, 由于这些类的实际类名部被隐蔽在工厂内部,因此客户端根本不须要关心如何对它们进行实例化的细节。每种设计模式都是针对特定问题的办理方案,而抽象工厂模式面临的问题则是当涉及到有多个产品等级构造寸,如何更好地进行软件体系构造的设计。
优缺陷
优点
详细产品在运用层代码隔离,调用者无需知道详细实现,只要知道工厂和产品接口就可以了将一个系列的产品统一到一起创建分离详细实现类,调用者通过抽象类或者接口操作实例。缺陷
难以支持新种类的产品,规定了所有可能被创建的产品凑集,如果工厂接口,或者产品接口改变所有涉及到的类都须要进行修正增加了系统的抽象性和理解难度代码过于臃肿,如果产品过多须要添加很多类文件利用场景
一个别系要独立于它的产品的创建、组合和表示时。一个别系要由多个产品系列中的一个来配置时。须要强调一系列干系的产品工具的设计以便进行联合利用时。供应一个产品类库,而只想显示它们的接口而不是实现时。适宜利用在产品不常变比较固定的情形。支付接口SDK开拓,把多家api接口统一本钱身的SDK方法。跨平台运用皮肤适配,在Windows一套样式、Mac一套样式。示例代码
CompanyInterface.php
interface CompanyInterface{ public function Pay(); public function Im();}
Alibaba.php
class Alibaba implements CompanyInterface{ public function Pay() { return new Alipay(); } public function Im() { return new Wangwang(); }}
Tencent.php
class Tencent implements CompanyInterface{ public function Pay() { return new WechatPay(); } public function Im() { return new Wechat(); }}
PayInterface.php
interface PayInterface{ public function paying(); public function transfer();}
Alipay.php
class Alipay implements PayInterface{ public function paying() { echo "利用支付宝付款\n"; } public function transfer() { echo "利用支付宝转账\n"; }}
WechatPay.php
class WechatPay implements PayInterface{ public function paying() { echo "利用微信付款\n"; } public function transfer() { echo "利用微信转账\n"; }}
ImInterface.php
interface ImInterface{ public function text(); public function video();}
Wangwang.php
class Wangwang implements ImInterface{ public function text() { echo "利用旺旺发送文本\n"; } public function video() { echo "利用旺旺发送视频\n"; }}
Wechat.php
class Wechat implements ImInterface{ public function text() { echo "利用微信发送文本\n"; } public function video() { echo "利用微信发送视频\n"; }}
调用代码:
$alibaba = new Alibaba();$alibaba->Pay()->paying();//调用支付宝付款方法$alibaba->Pay()->transfer();//调用支付宝转账方法$alibaba->Im()->text();//调用旺旺文本谈天方法$alibaba->Im()->video();//调用旺旺视频谈天方法echo "--------------华美分割线--------------\n";$tencent = new Tencent();$tencent->Pay()->paying();//调用微信支付付款方法$tencent->Pay()->transfer();//调用微信支付转账方法$tencent->Im()->text();//调用微信文本谈天方法$tencent->Im()->video();//调用微信视频谈天方法
输出内容:
利用支付宝付款利用支付宝转账利用旺旺发送文本利用旺旺发送视频--------------华美分割线--------------利用微信付款利用微信转账利用微信发送文本利用微信发送视频
文章看再多不如亲手敲代码,只有自己写过多代码才是吸取精髓。
如果以为文章还不错,请把文章分享给更多的人学习,在文章中创造有误的地方也希望各位指出更正。现有误的地方也希望各位指出更正。
微信公众年夜众号:IT不是挨踢