抽象工厂模式的基本思想:
例如一个电气工厂,它可以生产电视机、冰箱、空调等多种电器,而不是只生产,某一种电器,此事可以考虑将一些相关的产品组成一个产品“产品族”,由同一个工厂来统一生产。
产品等级结构:即产品的继承结构
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的位于不同产品等级结构中的一组产品。
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
抽象工厂模式与工厂方法模式的区别:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。
抽象工厂模式结构与实现
结构
(1)AbstractFactory(抽象工厂):它声明了一组创造一族产品的方法,每一个方法对应一种产品。 (2)ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。 (3)AbsractFactory(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所有具有的业务方法。 (4)ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
开闭原则的倾斜性
造抽象工厂模式中增加新的产品族很方便,但是增加新的产品等级结构很麻烦,抽象工厂模式的这种性质成为开闭原则的倾斜性。
抽象工厂模式的优点
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
抽象工厂模式的缺点
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性
抽象工厂模式的适用环境
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的,用户无需关心对象的创建过程,将对象的创建和使用解耦。
2、系统中有多于一个的产品族,而每次只使用其中某一产品族。
3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
4、产品等级结构稳定,在设计完成之后不会像系统中增加新的产品等级结构或者删除已有的产品等级结构。