的抽象工厂模式是工厂模式系列的重头戏。没错,就是那个传闻中的抽象工厂模式。当你第一次听到这个名字时是什么感觉?反正我觉得这个产品应该很高大上,毕竟包含了“抽象”二字。或者说,这两个词在开发中真的有点高高在上,抽象这个词似乎处处都非常厉害。不过,抽象工厂确实可以说是工厂模式的老大哥。Gof类图及解释其实只要了解了工厂方法模式,理解抽象工厂模式就很容易了。怎么说?到子类还是一样的延迟,返回指定对象还是一样。只不过抽象工厂不是只返回一个对象,而是返回一堆。GoF定义:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。GoF类图的左边是两个工厂1和2,它们都继承了一个抽象工厂,分别实现了CreateProductA和CreateProductB方法。工厂1生产ProductA1和ProductB1,工厂2生产ProductA2和ProductB2。代码实现//商品A抽象接口interfaceAbstractProductA{publicfunctionshow():void;}//ProductA1implementsclassProductA1implementsAbstractProductA{publicfunctionshow():void{echo'ProductA1isShow!'.PHP_EOL;}}//ProductA2implements类ProductA2implementsAbstractProductA{publicfunctionshow():void{echo'ProductA2isShow!'.PHP_EOL;}}//ProductB抽象接口interfaceAbstractProductB{publicfunctionshow():void;}//ProductB1implementsclassProductB1implementsAbstractProductB{publicfunctionshow():void{echo'ProductB1isShow!'.PHP_EOL;}}//ProductB2implements类ProductB2implementsAbstractProductB{publicfunctionshow():void{echo'ProductB2isShow!'.PHP_EOL;}}商品的实现,有很多东西。这次实际上有四种商品,分别是A1、A2、B1、B2。假设他们之间存在这样的关系。A1和B1是同类相关商品,而B1和B2是同类相关商品//abstractfactoryinterfaceinterfaceAbstractFactory{//创建商品Apublicf函数CreateProductA():AbstractProductA;//创建产品BpublicfunctionCreateProductB():AbstractProductB;}//工厂1,实现产品A1和产品B1AbstractProductB{returnnewProductB1();}}//Factory2实现产品A2和产品B2();}}而我们的工厂也是工厂1和工厂2,工厂1生产两个相关的产品A1和B1,工厂2生产A2和B2嗯,我知道这个还是有点抽象,可能还是看不懂为什么会这样,我们继续以手机生产为例,我们的手机品牌上升了,那么手机贴膜、手机壳等周边也都交给了abstractFactory来帮助我。上次说了,我已经有几款不同型号的手机了,所以和之前一样,衡阳工厂(Factory1)生产1001型号的手机(ProductA1),同时生产手机贴膜(ProductB1)和手机1001型手机ProductC1)的手机壳(ProductB1)也在衡阳工厂生产。1002型号的手机(ProductA2)还在郑州工厂(Factory2),所以让他们处理这个型号的手机贴膜(ProductB2)和手机贴膜(ProductC2)。于是,我就去总厂下单了。他们让不同的工厂为我生产一整套手机产品,我可以直接卖掉!!完整代码:抽象工厂模式实例是不是有点晕?其实简单点说,真的就是在一个工厂类中通过不同的方法返回不同的对象。我们再用发短信的例子来说明!场景:这次我们有一个业务需求,不仅要发送短信,还要同时发送一条推送。短信的目的是通知用户有新的活动可以参与,而推送通知不仅通知用户有新的活动,还可以直接点击进入领取红包,是不是很刺激。好在我们之前选择的云服务商都有短信和推送接口,所以我们可以直接使用抽象工厂来实现!短信发送类图createMessage();$push=$factory->createPush();echo$message->send('您好久没有登录了,系统已启动,记得回来哦!');echo$push->send('您有新红包到账,请查收它!');完整源码:短信发送工厂的方法描述的很清楚吗?没错,我们有两个产品,一个是Message,一个是Push,分别是发送消息和发送推送。抽象工厂只需要我们的接口实现者实现两个方法返回发送短信和发送推送的对象即可。我只想发短信,不想发推送消息,可以吗?当然没关系,不调用createPush()方法即可。抽象工厂最适合什么场景?显然,创建一系列相关对象的工厂方法模式是抽象工厂的核心,相当于在一个大工厂中放入多个工厂方法,生产出一套完整的产品(包括外设),而不是单一的产品。不化妆?你搭配过衣服吗?我们需要一层一层地化妆,还需要从里到外穿衣服?如果你还没试过(海南程序员常年有背心+短裤???那你也得穿内衣!!)。。。没关系,带你了解一下装饰者模式。各媒体平台均可搜索【硬核项目经理】
