前言
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。是前面简单工厂模式和工厂方法模式的升级,该超级工厂又成为其他工厂的工厂。这种类型的设计模式属于创建型类型,它提供一种创建对象的最佳方式。
为什么说是工厂的工厂,在工厂方法模式中具体的工厂负责生产具体的产品,每个具体工厂对应一种具体的类。
抽象工厂模式
在抽象工厂模式中包含如下几个角色:
- AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
- ConcreteFactory(具体工厂):它实现了抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于等级结构中。
- AbstractProduct(抽象产品):它为每个产品声明接口,在抽象产品中声明了产品所有的业务方法
- ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明方法。
在抽象工厂中声明了多个工厂方法,用于创建不同类型的产品,抽象工厂可以是接口,也可以是抽象类或者具体类,其典型代码如下所示:
1 | package com.yubulang.abstractfactory; |
2 | |
3 | // 抽象一个工厂 |
4 | public abstract class AbstractFactory { |
5 | public abstract AbstractProductA createProductA(); |
6 | |
7 | public abstract AbstractProductB createProductB(); |
8 | } |
9 | |
10 | // 实现工厂就相当于创建了一个工厂,工厂还能随意组装我们的生产线 |
11 | // 生产对应的产品 |
12 | class ConcreteFactory01 extends AbstractFactory { |
13 | public AbstractProductA createProductA() { |
14 | return new ConcreteProductA01(); |
15 | } |
16 | |
17 | public AbstractProductB createProductB() { |
18 | return new ConcreteProductB01(); |
19 | } |
20 | } |
21 | |
22 | abstract class AbstractProductA { |
23 | |
24 | } |
25 | |
26 | abstract class AbstractProductB { |
27 | |
28 | } |
29 | |
30 | class ConcreteProductA01 extends AbstractProductA { |
31 | |
32 | } |
33 | |
34 | class ConcreteProductB01 extends AbstractProductB { |
35 | |
36 | } |
与工厂方法模式一样,抽象工厂模式也可为每个产品提供一组重载的工厂方法,以不同的方式对产品对象进行创建。
抽象工厂模式总结
由于它提供了功能更为强大的工厂类并且具备较好的可扩展性,在软件开发中得以广泛应用,尤其是在一些框架和 API 类库的设计中,例如在 Java 语言的 AWT(抽象窗口工具包)中就使用了抽象工厂模式,它使用抽象工厂模式来实现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面。抽象工厂模式也是在软件开发中最常用的设计模式之一。
主要优点:
抽象工厂模式的主要优点如下:
抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
主要缺点:
增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。
总结
具体还是看大家如何应用,跟着需求走。