工厂模式

简单工厂、工厂方法、抽象工厂介绍及差异

1. 简单工厂(Simple Factory)

定义:由一个工厂类根据传入的参数,动态决定创建哪一种产品类的实例。

结构

  • 工厂类(Factory):负责创建所有产品,包含核心创建逻辑
  • 抽象产品(Product):产品的公共接口
  • 具体产品(ConcreteProduct):工厂创建的具体对象

示例代码(Java)

// 抽象产品
interface Product {
    void doSomething();
}

// 具体产品A
class ConcreteProductA implements Product {
    public void doSomething() {
        System.out.println("产品A功能");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    public void doSomething() {
        System.out.println("产品B功能");
    }
}

// 工厂类
class SimpleFactory {
    public static Product createProduct(String type) {
        if ("A".equals(type)) {
            return new ConcreteProductA();
        } else if ("B".equals(type)) {
            return new ConcreteProductB();
        }
        return null;
    }
}

优点:简单易实现,将产品创建逻辑集中
缺点:工厂类职责过重,增加新产品需修改工厂类(违反开闭原则)


2. 工厂方法(Factory Method)

定义:定义一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法将对象的实例化延迟到子类。

结构

  • 抽象工厂(Factory):声明工厂方法
  • 具体工厂(ConcreteFactory):实现工厂方法,创建具体产品
  • 抽象产品(Product)
  • 具体产品(ConcreteProduct)

示例代码(Java)

// 抽象产品
interface Product {
    void doSomething();
}

// 具体产品A
class ConcreteProductA implements Product {
    public void doSomething() {
        System.out.println("产品A");
    }
}

// 抽象工厂
interface Factory {
    Product createProduct();
}

// 具体工厂A
class ConcreteFactoryA implements Factory {
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

优点:符合开闭原则,增加新产品只需增加对应工厂类
缺点:类数量增加,系统复杂度提高


3. 抽象工厂(Abstract Factory)

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。适用于产品族(多个产品类型)的场景。

结构

  • 抽象工厂(AbstractFactory):声明创建一系列产品的方法
  • 具体工厂(ConcreteFactory):实现创建产品族的方法
  • 抽象产品(AbstractProduct):多个不同产品类型
  • 具体产品(ConcreteProduct)

示例代码(Java)

// 抽象产品A
interface ProductA {
    void use();
}

// 抽象产品B
interface ProductB {
    void eat();
}

// 具体产品A1
class ProductA1 implements ProductA {
    public void use() { System.out.println("A1"); }
}

// 具体产品B1
class ProductB1 implements ProductB {
    public void eat() { System.out.println("B1"); }
}

// 抽象工厂
interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
    public ProductA createProductA() { return new ProductA1(); }
    public ProductB createProductB() { return new ProductB1(); }
}

优点:保证产品族内对象一致性,易于交换产品族
缺点:增加新产品类型困难(需修改所有工厂类)


核心差异对比表

特性 简单工厂 工厂方法 抽象工厂
目的 单一产品快速创建 单个产品扩展性 产品系列(族)的一致性
产品数量 单个产品 单个产品 多个相关产品
新增产品 改工厂类(if-else) 加新工厂类 ✅ 加新工厂类,但若新增产品类型(如床)则需改所有工厂 ❌
客户端感知 知道工厂类和参数 知道具体工厂子类 知道具体工厂子类和产品族
设计原则 违反开闭原则 符合开闭原则 对产品族符合开闭,对产品种类扩展不友好
复杂度

选择建议

  • 简单工厂:产品类型少、变动小、不需要扩展时
  • 工厂方法:产品类型多、经常新增产品、客户端无需关心具体类名时
  • 抽象工厂:需要保证多个产品一起使用、产品族频繁更换时(如换皮肤、换数据库)
posted @ 2026-04-13 17:38  LARRY1024  阅读(2)  评论(0)    收藏  举报