大战设计模式【6】—— 抽象工厂模式
抽象工厂模式(Abstract Factory)
设计模式使用的例子
https://github.com/LinkinStars/DesignPatternsAllExample
一、定义
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类,它是一种对象创建型模式。
二、结构
AbstractFactory (抽象工厂角色):声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
ConcreteFactory (具体工厂角色):实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族。
AbstractProduct (抽象产品角色):为每种产品声明接口,在抽象产品中声明了所有的业务方法。
ConcreteProduct (具体产品角色):定义具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。
三、优点
隔离了具体类的生成,使得客户并不需要知道什么被创建。因为这种隔离,因此更换一个具体工厂就变得相对容易。
当一个产品族中的多个对象被设计称一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
增加新的产品族很方便,无需修改已有系统,符合开闭原则。
四、缺点
增加新的产品等级结构很麻烦,因为需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这必然会带来较大的不便。
在这个角度,它违背了开闭(对扩展开放,对修改封闭)原则。
五、应用场景
用户无须关心对象的创建过程,需要将对象的创建和使用解耦
系统中有多余一个的产品族,而每次都只使用其中的某一种产品族。
产品等级结构稳定!设计完成之后,不会向系统中增加新的产品等级结构或删除已有产品等级结构。
六、个人总结
1、首先需要区分两个概念:产品族、产品等级(叫什么名字不重要)
产品族:本质上完全不同的产品的组合,比如盒子与苹果,本质上完全不同,但是它们可以属于一个产品族,组成盒装苹果
产品等级:本质上相同但是特性上面有差异的产品,如红盒子和蓝盒子,本质上都是盒子,只是颜色不同
(这两个概念的大小用使用者自己控制,你可以说苹果香蕉本质上不同,但是也可以说在水果的条件下,它们都属于水果)
2、区分这两个概念就能弄懂工厂方法模式和抽象工厂模式有什么区别了。
因为工厂方法模式针对的是一个产品等级结构;
而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级中的产品对象的创建。
简单的说抽象工厂模式面向多个产品族开发,而工厂方法模式面向单个产品等级开发。
3、从广义上来看,我们可以说工厂方法模式隐藏在抽象工厂模式其中。
4、当我们面向的是产品族的开发,需要用同一等级的不同产品合成一个族来获得最终需要的东西时,就可以使用抽象工厂模式。
抽象工厂模式对于产品族非常友好,比如今天要添加一套所有都带有红色的产品,那么就相当于与只要建立一个红色产品族即可。
但是对产品等级不友好,也就是一旦你有一天需要增加单一一个花的盒子,但是不需要增加花的苹果,那么修改就会比较可怕了。
参考博客:http://www.cnblogs.com/edisonchou/p/6777901.html