抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式,其定义如下:Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。)
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
3.1、场景示例
例如在简单工厂模式中,我们创建了不同颜色的书籍,红书,绿书,以及蓝书,随着工厂的日益增长,书店讨论创建分店,一个店卖IT技术类书籍,一类专门卖小说。这个时候我们简单工厂就不太方便实现这种需求了,所以抽象工厂模式来了。
3.2、代码分析
因为有了新的产品,所以基于书店的模式,我们需要对书籍作出调增,如下:
基于上面的修改,其代码如下:
abstract class Book {abstract String getType();abstract String getColor();abstract Float getPrice();}abstract class RedBook extends Book {@OverrideString getColor() {return "RED";}}abstract class GreenBook extends Book {@OverrideString getColor() {return "GREEN";}}// 具体书籍实现class RedITBook extends RedBook {@OverrideString getType() {return "IT";}@OverrideFloat getPrice() {return 123F;}}class RedStoreBook extends RedBook {@OverrideString getType() {return "Store";}@OverrideFloat getPrice() {return 3243.43F;}}// 蓝色的书籍class BlueITBook extends RedBook {@OverrideString getType() {return "IT";}@OverrideFloat getPrice() {return 123F;}}class BlueStoreBook extends RedBook {@OverrideString getType() {return "Store";}@OverrideFloat getPrice() {return 3243.43F;}}
工厂新增创建ITFactory 以及 StoreFactory
interface Factory {Book createRedBook();Book createBlueBook();}class ITBookFactory implements Factory {@Overridepublic Book createRedBook() {return new RedITBook();}@Overridepublic Book createBlueBook() {return new BlueITBook();}}class StoreBookFactory implements Factory {@Overridepublic Book createRedBook() {return new RedStoreBook();}@Overridepublic Book createBlueBook() {return new BlueStoreBook();}}
3.3、总结
- 封闭性,每个产品的实现类不是高层模块要关心的
- 产品族内的约束为非公开状态,例如,在书籍的比例上,上层代码不需要了解,仅由内部控制
- 抽象工厂模式拓展产品族困难,比如新增了紫色书籍,对应的
ITBookFactory和StoreBookFactory均需要修改,违反了开闭原则。 - 从上面的UML类图中可以看到如果新增一个英文书籍,是非常方便的,只需要创建
RedEngishBook extends RedBook、BlueEnglishBook extends BlueBook以及EnglishFactory implement Factory即可,没有对其他代码进行修改,符合开闭原则。
