工厂模式三兄弟:从简单到抽象的设计演进

深入解析工厂模式的三种形态:简单工厂、工厂方法与抽象工厂。通过解构对象的创建逻辑,探讨如何实现系统的高内聚与低耦合,掌握面向对象设计的精髓。

12 分钟阅读
小明

工厂模式三兄弟:从简单到抽象的设计演进

在软件工程中,对象的创建往往比看起来要复杂。如果代码中充斥着大量的 new 关键字,系统将陷入高度耦合的泥潭——每当需要增加一种新的产品类型,你都不得不修改多处调用方的逻辑。

工厂模式(Factory Pattern) 的核心思想在于封装对象的创建过程,将“做什么”与“怎么做”解耦。本文将带你深度剖析工厂模式的三种递进形态。


一、 简单工厂模式(Simple Factory):对象的统一入口

简单工厂并非 23 种设计模式之一,但它是理解后续模式的基石。

1. 核心逻辑

通过一个中心化的工厂类,根据传入的参数决定创建哪一种产品实例。

2. 代码实现

public class ShapeFactory {
    public static Shape getShape(String shapeType) {
        if (shapeType == null) return null;
        if (shapeType.equalsIgnoreCase("CIRCLE")) return new Circle();
        if (shapeType.equalsIgnoreCase("RECTANGLE")) return new Rectangle();
        return null;
    }
}

3. 局限性

它违反了开闭原则(Open-Closed Principle)。每当你增加一种新形状,都必须修改 ShapeFactory 的源代码。


二、 工厂方法模式(Factory Method):让子类决定实例化

为了解决简单工厂的耦合问题,工厂方法模式将具体的创建逻辑下沉到了子类中。

1. 核心逻辑

定义一个创建对象的接口,但让子类决定要实例化的类是哪一个。

2. 架构优势

  • 符合开闭原则:增加新产品时,只需增加新的具体工厂类,无需修改既有代码。
  • 解耦:调用方只需持有抽象工厂的引用,完全不感知具体产品的类名。

3. 适用场景

当系统不知道它所必须创建的对象的类时,或者类希望由其子类来指定它所创建的对象时。


三、 抽象工厂模式(Abstract Factory):产品族的构建艺术

如果说工厂方法是针对一个“等级结构”的(如:各种品牌的汽车),那么抽象工厂则是针对“产品族”的(如:某个品牌下的整套配件)。

1. 核心逻辑

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2. 深度理解

想象一个 UI 套件:

  • MacFactory 创建 MacButtonMacCheckbox
  • WinFactory 创建 WinButtonWinCheckbox。 抽象工厂确保了你的应用程序在 Mac 环境下绝不会错误地渲染出一个 Windows 风格的按钮。

四、 对比与选型:如何避免过度设计?

模式复杂度灵活性适用场景
简单工厂内部产品数量极少且相对固定。
工厂方法需要频繁扩展产品品种。
抽象工厂极高需要维护一系列相关联的产品族。

结语:封装变化的哲学

工厂模式的本质是捕捉变化点。通过将对象创建的逻辑隔离在工厂内部,我们为系统的未来扩展留出了足够的呼吸空间。

小明视角: 技术的优劣往往取决于上下文。不要因为学会了抽象工厂就处处使用它。在简单的场景下,几行 if-else 或简单工厂往往比复杂的继承体系更具生命力。


下期预告

我们将探讨 微服务入门。当单体架构无法支撑业务的爆发式增长,我们该如何平滑地开启微服务之旅?