GoF定义:供应一个创建一系列干系或相互依赖工具的接口,而无需指定它们详细的类。
GoF类图
工厂方法构造类图
左边是两个工厂1和2,都继续一个抽象工厂,都实现了CreateProductA和CreateProductB方法工厂1生产的是ProductA1和ProductB1同样的,工厂2生产的是ProductA2和ProductB2
代码实现
//商品A抽象接口interfaceAbstractProductA{publicfunctionshow():void;}//商品A1实现classProductA1implementsAbstractProductA{publicfunctionshow():void{echo'ProductA1isShow!'.PHP_EOL;}}//商品A2实现classProductA2implementsAbstractProductA{publicfunctionshow():void{echo'ProductA2isShow!'.PHP_EOL;}}//商品B抽象接口interfaceAbstractProductB{publicfunctionshow():void;}//商品B1实现classProductB1implementsAbstractProductB{publicfunctionshow():void{echo'ProductB1isShow!'.PHP_EOL;}}//商品B2实现classProductB2implementsAbstractProductB{publicfunctionshow():void{echo'ProductB2isShow!'.PHP_EOL;}}
商品的实现,东西很多吧,这回实在是有四件商品了分别是A1、A2、B1和B2,他们之间假设有这样的关系,A1和B1是同类干系的商品,B1和B2是同类干系的商品
//抽象工厂接口interfaceAbstractFactory{//创建商品ApublicfunctionCreateProductA():AbstractProductA;//创建商品BpublicfunctionCreateProductB():AbstractProductB;}//工厂1,实现商品A1和商品B1classConcreteFactory1implementsAbstractFactory{publicfunctionCreateProductA():AbstractProductA{returnnewProductA1();}publicfunctionCreateProductB():AbstractProductB{returnnewProductB1();}}//工厂2,实现商品A2和商品B2classConcreteFactory2implementsAbstractFactory{publicfunctionCreateProductA():AbstractProductA{returnnewProductA2();}publicfunctionCreateProductB():AbstractProductB{returnnewProductB2();}}
而我们的工厂也是工厂1和工厂2,工厂1生产的是A1和B1这两种干系联的产品,工厂2生产的是A2和B2这两种商品。好吧,我知道这里还是有点抽象,可能还是搞不懂为什么要这样,我们连续以手机生产来举例。
我们的手机品牌起来了,以是周边如手机膜、手机壳也交给了富X康(AbstractFactory)来帮我搞定。上回说到,我已经有几款不同类型的手机了,于是还是按原来那样,衡阳工厂(Factory1)生产型号1001的手机(ProductA1),同时型号1001手机的手机膜(ProductB1)和手机壳(ProductC1)也是衡阳工厂生产出来。而型号1002的手机(ProductA2)还是在郑州工厂(Factory2),这个型号的手机膜(ProductB2)和手机膜(ProductC2)也就交给他们来搞定吧。于是,我还是只去跟总厂下单,他们让不同的工厂给我生产了一整套的手机产品,可以直接卖套装咯!
!
完全代码:抽象工厂模式
实例是不是看得还是有点晕。实在说大略点,真的便是在一个工厂类中通过不同的方法返回不同的工具而已。让我们再次用发短信的实例来讲解吧!
场景:这次我们有个业务需求是,不仅要发短信,还要同时发一条推送。短信的目的是关照用户有新的活动参加,而推送不仅关照有新的活动,直接点击就可以进去领红包了,是不是很愉快。还好之前我们的选择的云做事供应商都是即有短信也有推送接口的,以是我们就直接用抽象工厂来实现吧!
短信发送类图
短信发送抽象工厂方法
<?phpinterfaceMessage{publicfunctionsend(string$msg);}classAliYunMessageimplementsMessage{publicfunctionsend(string$msg){//调用接口,发送短信//xxxxxreturn'阿里云短信(原阿里大鱼)发送成功!
短信内容:'.$msg;}}classBaiduYunMessageimplementsMessage{publicfunctionsend(string$msg){//调用接口,发送短信//xxxxxreturn'百度SMS短信发送成功!
短信内容:'.$msg;}}classJiguangMessageimplementsMessage{publicfunctionsend(string$msg){//调用接口,发送短信//xxxxxreturn'极光短信发送成功!
短信内容:'.$msg;}}interfacePush{publicfunctionsend(string$msg);}classAliYunPushimplementsPush{publicfunctionsend(string$msg){//调用接口,发送客户端推送//xxxxxreturn'阿里云Android&iOS推送发送成功!
推送内容:'.$msg;}}classBaiduYunPushimplementsPush{publicfunctionsend(string$msg){//调用接口,发送客户端推送//xxxxxreturn'百度Android&iOS云推送发送成功!
推送内容:'.$msg;}}classJiguangPushimplementsPush{publicfunctionsend(string$msg){//调用接口,发送客户端推送//xxxxxreturn'极光推送发送成功!
推送内容:'.$msg;}}interfaceMessageFactory{publicfunctioncreateMessage();publicfunctioncreatePush();}classAliYunFactoryimplementsMessageFactory{publicfunctioncreateMessage(){returnnewAliYunMessage();}publicfunctioncreatePush(){returnnewAliYunPush();}}classBaiduYunFactoryimplementsMessageFactory{publicfunctioncreateMessage(){returnnewBaiduYunMessage();}publicfunctioncreatePush(){returnnewBaiduYunPush();}}classJiguangFactoryimplementsMessageFactory{publicfunctioncreateMessage(){returnnewJiguangMessage();}publicfunctioncreatePush(){returnnewJiguangPush();}}//当前业务须要利用阿里云$factory=newAliYunFactory();//$factory=newBaiduYunFactory();//$factory=newJiguangFactory();$message=$factory->createMessage();$push=$factory->createPush();echo$message->send('您已经良久没有登录过系统了,记得回来哦!
');echo$push->send('您有新的红包已到帐,请查收!
');
完全源码:短信发送工厂方法
解释
是不是很清晰了?没错,我们有两个产品,一个是Message,一个是Push,分别是发信息和发推送抽象工厂只是哀求我们的接口实现者必须去实现两个方法,返回发短信和发推送的工具你说我只想发短信不想发推送可以吗?当然可以啦,不去调用createPush()方法不就行了抽象工厂最适宜什么场景?很明显,一系列干系工具的创建工厂方法模式是抽象工厂的核心,相称于多个工厂方法被放到一个大工厂中生产一整套产品(包含周边)而不是一件单独的产品下期看点有没有化过妆?有没有搭配过衣服?扮装我们要一层一层的化,衣服我们要从里向外的穿?都没试过的话(海南程序员整年背心+短裤吗???那你也得穿内裤吧!
!
)....没紧要,先带你理解下装饰者模式。