先前有简单工厂模式、工厂模式,工厂模式在简单工厂模式基础上解耦和。
而工厂模式和抽象工厂模式有什么不同呢?有人可能会发问,工厂模式的代码里面不是有个抽象的工厂类吗?
对于这一点,的确如此,但是每一个工厂类只能生产一个产品(要么香蕉,要么苹果),不能生产一个产品族(水果拼盘)。而抽象工厂模式刚好做到这一点,它能生产出一个产品族(包含很多种产品)
抽象工厂包含多个产品结构的声明,任何工厂类都必须实现这个借口。
请看下面代码:
<?php //创建水果基类 abstract class Fruit{ abstract public function say(); } //创建一个绿苹果类 class GreenApple extends Fruit{ public function say(){ echo "I'm Green Apple "; } } //创建一个红苹果类 class RedApple extends Fruit{ public function say(){ echo "I'm Red Apple "; } } //创建一个绿香蕉类 class GreenBanana extends Fruit{ public function say(){ echo "I'm Green banana "; } } //创建一个黄香蕉类 class YellowBanana extends Fruit{ public function say(){ echo "I'm Yellow banana "; } } //创建一个抽象工厂来 abstract class Factory{ abstract public function getApple(); abstract public function getBanana(); } //创建生产红苹果和黄香蕉的工厂类 class NotGreenFactory extends Factory{ public function getApple(){ return new RedApple; } public function getBanana(){ return new YellowBanana; } } //创建生产绿苹果和绿香蕉水果的工厂类 class GreenFactory extends Factory{ public function getApple(){ return new GreenApple; } public function getBanana(){ return new GreenBanana; } } //用绿色工厂类来生产水果,生产的水果为绿色 $factory=new GreenFactory(); $fruit=$factory->getApple(); $fruit->say();//I'm Green Apple //用非绿色工厂类来生产水果,生产的水果为非绿色 $factory=new NotGreenFactory(); $fruit=$factory->getBanana(); $fruit->say();//I'm Yellow banana ?>
看了上面的代码,感觉还没工厂模式好用,因为用抽象工厂模式,当有新产品的时候,不仅要创建新产品的类,还要修改抽象工厂类中的方法(添加获得新增产品的接口),然后让各具体工厂类实现,可以说是比较复杂的,很难扩展。