1.1 简介
1.1.1 概述
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。 抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。并且当一系列相互关联的产品被设计到一个工厂类里后,客户端的调用将会变得非常简单,而且,如果要更换这一系列的产品,则只需要更换一个工厂类即可。如果客户端需要创建一些产品结构,而这些产品结构又分别属于不同的产品类别,则可以使用抽象工厂模式,抽象工厂模式中抽象工厂类负责定义创建对象的接口,具体这一系列对象的创建工作由实现抽象工厂的具体工厂类来完成。
1.1.2 优缺点
优点: ① 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。 ② 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。 ③ 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
缺点: ① 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
1.2 案例
抽象工厂模式建议为系列中的每件产品明确声明接口,确保所有产品变体都继承这些接口。 例如,所有 ConcreteProductA 都实现 ProductA 接口;所有 ConcreteProductB 都实现 ProductB 接口,以此类推。接下来,声明抽象工厂——包含系列中所有产品构造方法的接口。例如 createProductA 、createProductB。这些方法必须返回抽象产品类型,即我们之前抽取的那些接口: ProductA、ProductB 等等。那么该如何处理产品变体呢?对于系列产品的每个变体,我们都将基于抽象工厂接口创建不同的工厂类。每个工厂类都只能返回特定类别的产品,例如,ConcreteFactory2 只能创建 ConcreteProductA2 、ConcreteProductB2 对象。 客户端代码可以通过相应的抽象接口调用工厂和产品类。无需修改实际客户端代码,就能更改传递给客户端的工厂类,也能更改客户端代码接收的产品变体。假设客户端想要工厂创建 ProductA。客户端无需了解工厂类,也不用管工厂类创建出的 ProductA 类型。无论是 ProductA1 还是 ProductA2 的 ProductA,对于客户端来说没有分别,它只需调用抽象 ProductA 接口就可以了。这样一来,客户端只需知道 ProductA 以某种方式实现了其方法就足够了。此外,无论工厂返回的是何种 ProductA 变体,它都会和由同一工厂创建 ProductB 风格一致。