工厂方法模式通过引入工厂等级结构。攻克了简单工厂模式中工厂类职责过重的问题。但因为工厂方法模式中每一个工厂仅仅生产一类产品,可能会导致系统中存在大量的工厂类,势必会添加系统的开销。此时,能够考虑将一些相关的产品组成一个“产品蔟”,由同一个工厂统一生产,这就是抽象工厂模式的基本思想。
产品等级结构和产品蔟
有时候希望一个工厂能够提供多个产品对象,而不是单一的产品对象。比如一个电器工厂,它能够生产电视机、电冰箱和空调等多种电器,而不是仅仅生产一种电器。
产品等级结构
(1) 产品等级结构即产品的继承结构。比如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机和详细品牌的电视机构成了一个产品等级结构,抽象电视机是父类。详细品牌的电视机是其子类。
(2)产品族。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。
比如,海尔电器工厂生产的海尔电视机、海尔电冰箱。
海尔电视机位于电视机产品等级结构中。海尔电冰箱位于电冰箱产品等级结构中。海尔电视机、海尔电冰箱构成一个产品族。
抽象工厂模式和工厂方法模式最大的差别在于,工厂方法模式针对的仅仅是一个产品等级结构,而抽象工厂须要面对多个产品等级结构,一个工厂等级结构能够负责多个不同产品等级结构中的产品对象的创建。
当一个工厂等级结构能够创建出分属于不同产品等级结构的一个产品族中的全部对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。
在图6-4中,每一详细工厂能够生产属于一个产品族的全部产品,比如生产颜色同样的正方形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。假设使用工厂方法模式,则须要15个详细工厂,而使用抽象工厂模式则仅仅须要5个详细工厂,极大地降低了系统中类的个数。
抽象工厂模式概述
抽象工厂模式:提供一个创建一系列相关对象的接口。而无需指定它们的详细类。
在抽象工厂模式中,每个详细工厂提供了多个工厂方法用于生产多种不同类型的产品。这些产品构成了一个产品族。
抽象工厂模式结构图
抽象工厂模式结构图中包括下面4个角色。
(1) AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法。每个方法相应一种产品。
(2) ConcreteFactory(详细工厂):它实现了在抽象工厂中声明的创建产品的方法,生产一组详细产品,这些产品构成了一个产品族,每个产品都位于某一个产品等级结构中。
(3) AbstractProduct(抽象产品):它为每种产品声明了接口,在抽象产品中声明了产品所具有的业务方法。
(4) ConcreteProduct(详细产品):它定义详细工厂生产的详细产品对象,实如今抽象产品接口中声明的业务方法。
开闭原则的倾斜性
(1) 添加产品族。对于添加新的产品族,抽象工厂模式非常好地支持了开闭原则,仅仅须要添加详细产品并相应加入一个新的详细工厂,对已有代码无需做不论什么改动。
(2)添加新的产品等级结构。对于添加新的产品等级结构。须要改动所以的工厂角色,包含抽象工厂类。在所以的工厂类中都须要添加生产新产品的方法。违背了开闭原则。
抽象工厂模式总结
主要长处
(1) 当一个产品族中的多个对象被设计成一起工作时,它可以保证client始终仅仅使用同一个产品族中的对象。
(2)添加新的产品族非常方便,无需改动已有代码,符合开闭原则。
主要缺点
添加新的产品等级结构麻烦,须要对原有系统进行较大改进,甚至改动抽象层代码。违背了开闭原则。
适用场景
(1) 系统中有多个产品族,而且每次仅仅使用当中某一个产品族。
(2) 添加新的产品族非常方便,无需改动已有系统,符合开闭原则。