抽象工厂模式
抽象工厂模式是工厂方法模式的升级版本,在学习什么是抽象工厂模式之前,需要对“
工厂方法模式”有一定的了解,可以点击链接【php工厂方法模式】查看进行了解。
个人理解:
如果说“工厂方法模式”是针对的是一个产品等级结构,那么,抽象工厂方法则是针对的多个产品等级结构。
引用前辈资料进行解释如下:
在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。
明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,
如果一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式;
如果一个工厂模式是提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模式了。
1 类的实现
代码示例:
# 定义一个抽象工厂接口AnimalFactory
interface AnimalFactory {
public function createCat(); # 创建方法1 createCat
public function createDog(); # 创建方法2 createDog
}
# 定义一个具体的工厂BlackAnimalFactory 其中实现了接口的两个方法createCat、createDog
class BlackAnimalFactory implements AnimalFactory {
# 方法1
function createCat(){
return new BlackCat();
}
# 方法2
function createDog(){
return new BlackDog();
}
}
# 定义另一个具体的工厂WhiteAnimalFactory 其中实现了接口的两个方法createCat、createDog
class WhiteAnimalFactory implements AnimalFactory {
# 方法1
function createCat(){
return new WhiteCat();
}
# 方法2
function createDog(){
return new WhiteDog();
}
}
到这里我们就已经可以看出来,该示例与工厂方法模式的区别了
,黑猫和白猫属于同一个等级结构,
黑狗和白狗属于同一个等级结构,显而易见出现了
两个等级结构,所以它不是工厂方法模式而是抽象工厂模式,这也是两者的区别之处。
我们继续看代码:
# 定义两个抽象的产品接口
interface Cat {
function Voice();
}
interface Dog {
function Voice();
}
# 定义具体的产品角色
class BlackCat implements Cat { # 角色1
function Voice(){
echo '我是一只黑猫';
}
}
class WhiteCat implements Cat { # 角色2
function Voice(){
echo '我是一只白猫';
}
}
class BlackDog implements Dog { # 角色3
function Voice(){
echo '我是一只黑狗';
}
}
class WhiteDog implements Dog { # 角色4
function Voice(){
echo '我是一只白狗';
}
}
# 定义一个访问
class Client {
public static function main(){
self::voice(new BlackAnimalFactory);
self::voice(new WhiteAnimalFactory);
}
private static function voice($AnimalFactory){
$cat = $AnimalFactory->createCat();
$cat->Voice();
echo '<br>';
$dog = $AnimalFactory->createDog();
$dog->Voice();
echo '<br>';
}
}
# 输出看一下
Client::main();
# 结果
我是一只黑猫
我是一只黑狗
我是一只白猫
我是一只白狗
2 结论
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于
工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了
解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
3 特点
优点:
1、
具备工厂方法的所有优点
2、
可以在类的内部对产品族进行约束(所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。)
缺点:
产品族的
扩展将会很麻烦,因为新增一个产品,则几乎所有的工厂类都需要进行修改。
更多设计模式文章请点击下面链接:
【设计模式概述】 http://blog.csdn.net/bk_guo/article/details/73828064
【简单工厂模式】 http://blog.csdn.net/bk_guo/article/details/73849317
【单例模式】 http://blog.csdn.net/bk_guo/article/details/73845244
【工厂方法模式】 http://blog.csdn.net/bk_guo/article/details/73896262