参考
- 《设计模式解析》 第十一章 Abstract Factory模式
- 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式
- 《Android源码设计模式解析与实战》第6章 创建型设计模式--抽象工厂模式
意图
协调对象的实例化,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
我觉得就是在工厂方法模式里的工厂类再做一层抽象,从一维抽象升级为二维抽象,在纵向的基础上又加了横向。
别名
Kit
适用场景
- 一个系统要独立于它的产品创建,组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
结构
- AbstracFactory: 抽象工厂,它声明了一组用于创建产品的方法,每一个方法对应一种产品。
- ConcreteFactory: 具体工厂,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品种类,每一个产品都位于某个产品等级结构中。
- AbstractProduct: 抽象产品角色,他为每种产品声明接口
- ConcreteProduct: 具体产品角色,他定义了具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
例子1 车厂造车
描述
奥迪Q3,Q5,Q7都是一个车系,但是三者之间的零部件差别却是很大,比如Q3的发动机是国产的,Q7是原装进口的,Q3的轮胎是普通轮胎,Q7是越野轮胎。所以工厂造一辆车,要分别造发动机,轮胎,制动系统组成。
代码实现
有类图了,略
应用例子2 Android中的MediaPlayerFactory
优点
- 分离接口和实现,客户端使用抽象工厂来创建需要的对象,而客户端根本不知道具体的实现是谁,客户端只是面向产品的接口编程而已。
缺点
- 使类文件爆炸
- 不太容易扩展新的产品类,每当我们想要增加一个产品类就需要修改抽象工厂,那么所有的具体工厂都要修改。