简单工厂、工厂方法和抽象工厂都是创建型设计模式,用于解耦对象的创建与使用,但它们在结构、扩展性、适用场景上有明显区别。以下是三者的详细对比:
1. 简单工厂(Simple Factory)
特点
- 不属于GoF 23种设计模式,但是一种常用的编程技巧。
- 通过一个静态方法或普通方法,根据输入参数决定创建哪种具体对象。
- 所有对象的创建逻辑集中在一个工厂类中。
代码示例
java
public class SimpleFactory {
public static Product createProduct(String type) {
switch (type) {
case "A": return new ProductA();
case "B": return new ProductB();
default: throw new IllegalArgumentException("Unknown type");
}
}
}
// 使用
Product product = SimpleFactory.createProduct("A");
优缺点
- ✅ 优点:简单直观,适合产品种类固定的场景。
- ❌ 缺点 :
- 违反开闭原则(新增产品需修改工厂类)。
- 工厂类职责过重,难以维护。
适用场景
- 产品种类较少且不太可能扩展(如日志工具、简单配置解析器等)。
2. 工厂方法(Factory Method)
特点
- GoF设计模式之一,定义一个创建对象的接口,但由子类决定实例化哪个类。
- 将对象的创建延迟到子类,每个具体工厂只负责创建一种产品。
代码示例
java
// 抽象工厂接口
public abstract class Creator {
public abstract Product createProduct();
}
// 具体工厂
public class ConcreteCreatorA extends Creator {
@Override
public Product createProduct() {
return new ProductA();
}
}
// 使用
Creator creator = new ConcreteCreatorA();
Product product = creator.createProduct();
优缺点
- ✅ 优点 :
- 符合开闭原则(新增产品只需新增工厂子类)。
- 职责清晰,每个工厂只负责一种产品。
- ❌ 缺点 :
- 类数量增加(每新增一个产品就要新增一个工厂类)。
适用场景
- 产品可能频繁扩展(如支持多种数据库、UI组件等)。
- 需要解耦对象的创建逻辑(如框架设计)。
3. 抽象工厂(Abstract Factory)
特点
- GoF设计模式之一 ,提供一个接口用于创建一系列相关或依赖的对象,而无需指定具体类。
- 每个具体工厂可以创建多个产品(产品族)。
代码示例
java
// 抽象工厂接口(创建多个产品)
public interface AbstractFactory {
Button createButton();
Checkbox createCheckbox();
}
// 具体工厂(Windows风格)
public class WindowsFactory implements AbstractFactory {
@Override
public Button createButton() { return new WindowsButton(); }
@Override
public Checkbox createCheckbox() { return new WindowsCheckbox(); }
}
// 具体工厂(Mac风格)
public class MacFactory implements AbstractFactory {
@Override
public Button createButton() { return new MacButton(); }
@Override
public Checkbox createCheckbox() { return new MacCheckbox(); }
}
// 使用
AbstractFactory factory = new WindowsFactory();
Button button = factory.createButton();
Checkbox checkbox = factory.createCheckbox();
优缺点
- ✅ 优点 :
- 保证同一工厂创建的产品属于同一风格(如Windows/Mac UI组件)。
- 符合开闭原则(新增产品族只需新增工厂)。
- ❌ 缺点 :
- 复杂度高,适合大型系统。
- 新增产品类型(如新增
Slider)需修改所有工厂接口。
适用场景
- 需要创建多个相关对象(如UI组件库、跨平台应用)。
- 系统需要支持多套风格或主题(如白天/夜间模式)。
三者的核心区别
| 对比项 | 简单工厂 | 工厂方法 | 抽象工厂 |
|---|---|---|---|
| 是否GoF模式 | 否 | 是 | 是 |
| 创建对象数量 | 单个产品 | 单个产品 | 多个相关产品(产品族) |
| 扩展性 | 差(需修改工厂类) | 好(新增工厂子类) | 好(新增工厂实现) |
| 复杂度 | 低 | 中 | 高 |
| 典型应用 | 工具类、配置解析 | 框架设计、数据库驱动 | UI组件库、跨平台应用 |
如何选择?
- 简单工厂:产品种类固定,且无需频繁扩展(如工具类)。
- 工厂方法:产品可能扩展,但每次只创建一个对象(如JDBC驱动)。
- 抽象工厂:需要创建多个相关产品,且需保证风格一致(如GUI库)。
💡 提示:抽象工厂可以结合工厂方法实现(每个具体工厂内部用工厂方法创建产品)。