抽象工厂模式:
kit模式,提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
和工厂方法模式不同的是,抽象工厂模式的工厂方法创建的是一个产品族,每一个产品都位于某个产品等级结构中。
同样,4个角色:
(1)AbstractFactory抽象工厂:声明了一组用于创建一族产品的方法,每个方法对应一种产品。
(2)ConcreteFactory具体工厂:实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品(不是一个产品对象实例),构成一个产品族。
(3)AbstractProduct抽象产品:为每种产品声明接口,抽象产品中声明了产品所具有的业务方法;
(4)ConcreteProduct具体产品:定义了具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。
什么是产品族:比如相同颜色的正方形、矩形、三角形是一个产品族,不同颜色的正方形是一个产品等级结构,每一个颜色的形状对象都位于某个产品族,并属于某个产品等级结构。在抽象工厂模式,产品族是指有同一个工厂生产的,位于不同产品等级结构的一组产品,比如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、电冰箱构成了一个产品族。
总结:
1.优点
(1)隔离了具体类的生产,使得客户不需要知道什么被创建。只需要改变具体工厂的实例,就可以改变系统的行为。
(2)当一个产品族的多个对象被设计成一起工作时,能保证客户端始终只使用同一个产品族的对象。
(3)增加新的产品族很方便,无需修改已有系统,符合开闭原则。
2.缺点
(1)增加新的产品等级结构很麻烦,需要对原有系统进行较大修改,甚至修改抽象层代码,不符合开闭原则。
3.适用场景
(1)一个系统不依赖于产品类实例如何被创建、组合和表达的细节。
(2)系统有多于一个的产品族,每次只使用其中某一个产品族。
(3)属于同一个产品族的产品将在一起使用。
(4)产品等级结构稳定。