工厂模式三兄弟:从简单到抽象的设计演进
深入解析工厂模式的三种形态:简单工厂、工厂方法与抽象工厂。通过解构对象的创建逻辑,探讨如何实现系统的高内聚与低耦合,掌握面向对象设计的精髓。
工厂模式三兄弟:从简单到抽象的设计演进
在软件工程中,对象的创建往往比看起来要复杂。如果代码中充斥着大量的 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 创建 MacButton 和 MacCheckbox。
- WinFactory 创建 WinButton 和 WinCheckbox。 抽象工厂确保了你的应用程序在 Mac 环境下绝不会错误地渲染出一个 Windows 风格的按钮。
四、 对比与选型:如何避免过度设计?
| 模式 | 复杂度 | 灵活性 | 适用场景 |
|---|---|---|---|
| 简单工厂 | 低 | 低 | 内部产品数量极少且相对固定。 |
| 工厂方法 | 中 | 高 | 需要频繁扩展产品品种。 |
| 抽象工厂 | 高 | 极高 | 需要维护一系列相关联的产品族。 |
结语:封装变化的哲学
工厂模式的本质是捕捉变化点。通过将对象创建的逻辑隔离在工厂内部,我们为系统的未来扩展留出了足够的呼吸空间。
小明视角:
技术的优劣往往取决于上下文。不要因为学会了抽象工厂就处处使用它。在简单的场景下,几行 if-else 或简单工厂往往比复杂的继承体系更具生命力。
下期预告
我们将探讨 微服务入门。当单体架构无法支撑业务的爆发式增长,我们该如何平滑地开启微服务之旅?