1. 模式意图
提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。
为了方便引进抽象工厂模式,引入一个概念:产品族(Product Family),是指位于不同产品等级结构,功能相关联的产品组成的家族,如图:
上图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所处的等级结构,就可以唯一的确定这个产品。
引进抽象工厂模式:
所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象,如图:
2. 模式定义
抽象工厂(Abstract Factory):声明一个创建抽象产品对象的操作接口。
具体工厂(Concrete Factory):实现创建具体产品对象的操作。
抽象产品(Abstract Product):为一类产品对象声明一个接口;担任这个角色的类是工厂方法模式所创建的对象的弗雷,或它们共同拥有的接口。
具体产品(Concrete Product):实现一个将被相应的具体工厂创建的产品对象;实现AbstractProduct接口.
模式定义的内容用产品族描述如下:
3. 模式实现
4. 模式应用
在以下情况下应当考虑使用抽象工厂模式:
- 一个系统不应当依赖于产品类实例如何被创建,组合和表达的细节
- 这个系统有多于一个的产品族,而系统只消费其中某一个产品族
- 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而是客户端不依赖于实现
4.1 抽象工厂的起源
比如在Windows和Unix系统下都有视窗环境的构件,在每一个操作系统中,都有一个视窗构件组成的构件家族。通过一个抽象角色给出功能描述,而由具体子类给出不同操作系统下的具体实现,如图:
上面产品类图有两个产品等级结构,分别是Button与Text;同时有两个产品族:Unix产品族与Windows产品族:
抽象工厂模式如下: