【设计模式】简单工厂、工厂方法、抽象工厂

简单工厂、工厂方法和抽象工厂都是创建型设计模式,用于解耦对象的创建与使用,但它们在结构、扩展性、适用场景上有明显区别。以下是三者的详细对比:


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组件库、跨平台应用

如何选择?

  1. 简单工厂:产品种类固定,且无需频繁扩展(如工具类)。
  2. 工厂方法:产品可能扩展,但每次只创建一个对象(如JDBC驱动)。
  3. 抽象工厂:需要创建多个相关产品,且需保证风格一致(如GUI库)。

💡 提示:抽象工厂可以结合工厂方法实现(每个具体工厂内部用工厂方法创建产品)。

相关推荐
李斯维1 小时前
工厂设计模式(Factory Pattern):工厂方法与抽象工厂的实例演示
java·设计模式
码农翻身1 小时前
设计模式,1994年生,2034卒
设计模式
怕浪猫10 小时前
荒岛原始无工业、无电力、无设备,从零搭建最基础计算机体系
人工智能·设计模式·面试
希望永不加班13 小时前
枚举进阶用法:超越常量的设计模式应用
设计模式
summer__777715 小时前
设计模式知识点总结
设计模式
青山师15 小时前
动态代理深度解析:JDK与CGLIB底层实现与实战
java·设计模式·面试·动态代理·java面试·cglib
蜡笔小马17 小时前
03.C++设计模式-原型模式
c++·设计模式·原型模式
何陋轩1 天前
Spring AI + RAG实战:打造企业级智能问答系统
后端·算法·设计模式
sindyra1 天前
享元模式(Flyweight Pattern)
java·开发语言·设计模式·享元模式·优缺点