深入解析工厂模式:简单工厂、工厂方法与抽象工厂的三种实现方式及其应用场景
工厂模式属于创建模式。创建模式对类的实例化过程进行了抽象,要求“创建与使用分离”。

使用场景包括:
工厂模式有三种不同的实现,即简单工厂模式、工厂方法模式和抽象工厂模式。共同的特点是定义一个创建对象的工厂接口,将对象的实际创建工作交给具体的子工厂类。
这三种实现方法都是基于工厂方法模式的。简单的对象创建过程使用简单工厂模式,多类、复杂的创建过程使用抽象工厂模式。
为了解释这种模式,将正在创建的对象称为“产品”,将创建产品的对象称为“工厂”。
工厂方法模式
工厂方法模式,又称工厂模式、多态工厂模式、虚拟构造函数模式,其核心思想是由不同的子类负责生成具体的对象,使工厂生产类符合开闭原则,而具体的工厂类符合单一责任原则。
工厂方法模式由四个角色组成:抽象工厂、具体工厂、抽象产品和具体产品。
组成(角色)
关系
影响
抽象产品
特定产品的父类
描述特定产品的公共接口
混凝土产品
抽象产品的子类;工厂类创建的目标类
描述生产的具体产品
抽象工厂(创建者)
具体工厂的父类
描述特定工厂的公共接口
具体创造者
抽象工厂的子类;受外界号召生产特定产品
描述具体工厂;实现工厂方法来创建产品的实例
类图如下:
如果客户端想要获取一个产品实例,只需要交给工厂类即可。工厂类将完成整个创建过程。当然,还需要提前实例化具体的工厂类。
工厂方式模型会增加系统的复杂度,当有新产品出现时,类的数量会成对增加。只适合生产一种产品类型的场景。
Spring源码中有很多工厂方法模式的应用。例如,FactoryBean 及其实现者就是工厂。子类ListFactoryBean可以创建List对象,子类MapFactoryBean可以创建Map对象。
简单工厂模式
简单工厂模式也称为静态方法模式。工厂类提供静态方法。它是工厂方法模式的一个特例。当产品系统比较有限时,不需要提供复杂的工厂系统,简化为使用工厂类的静态方法来生产有限的产品实例。
简单工厂模式由三个角色组成:工厂、抽象产品和具体产品。与工厂方法模式相比,工厂类取代了工厂系统。
类图如下:
客户端使用时,只需要调用工厂的静态方法,告诉它需要什么产品,就可以获取对应的产品实例。
简单工厂模式只是将对象的创建和使用分开。因为他只有一个工厂,添加产品就会影响一切,不符合开闭原则。
JDK源码中,java.util.Calendar实例化了自己的getInstance方法,使用的是工厂模式的简单工厂模式。
抽象工厂模式
抽象工厂模式提供了一个接口,用于创建一组相关或相互依赖的对象,而无需指定它们的具体类。可以说是工厂方法模式的扩展,用于需要创建的产品有多个产品线(产品族)的场景。
抽象工厂模式与工厂方法模式的作用相同,只不过产品可以水平扩展为多个产品族(并且可以支持多个级别)。在工厂中创建产品实例的方法也有多种。每个具体工厂都需要执行这个级别。所有产品是如何创建的。
类图如下:
客户端只需要知道抽象工厂模式提供的接口,不需要知道创建细节。产品族的添加符合开闭原则。
然而,当需要向产品族中添加新的产品类别(级别)时,所有工厂类都需要修改。在这种场景下,抽象工厂模式的使用增加了复杂性。