先前有简单工厂模式、工厂模式,工厂模式在简单工厂模式基础上解耦和。
而工厂模式和抽象工厂模式有什么不同呢?有人可能会发问,工厂模式的代码里面不是有个抽象的工厂类吗?
对于这一点,的确如此,但是每一个工厂类只能生产一个产品(要么香蕉,要么苹果),不能生产一个产品族(水果拼盘)。而抽象工厂模式刚好做到这一点,它能生产出一个产品族(包含很多种产品)
抽象工厂包含多个产品结构的声明,任何工厂类都必须实现这个借口。
请看下面代码:
<?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
?>
看了上面的代码,感觉还没工厂模式好用,因为用抽象工厂模式,当有新产品的时候,不仅要创建新产品的类,还要修改抽象工厂类中的方法(添加获得新增产品的接口),然后让各具体工厂类实现,可以说是比较复杂的,很难扩展。