一、先明确两个模式的核心定义

模式类型 核心定义
简单工厂模式 一个工厂类封装所有产品的创建逻辑,通过参数(如字符串 / 枚举)决定创建哪种产品
工厂方法模式 定义抽象工厂接口,将产品创建逻辑分散到多个具体工厂类中(一个工厂对应一个产品)

二、核心结构对比(可视化)

1. 简单工厂模式结构
classDiagram
    class SimpleFactory {
        +CreateProduct(type: string): IProduct
    }
    interface IProduct {
        +Use()
    }
    class ProductA {
        +Use()
    }
    class ProductB {
        +Use()
    }
    
    SimpleFactory --> IProduct
    ProductA --|> IProduct
    ProductB --|> IProduct
  • 核心:一个工厂类 + 多个产品类,工厂类集中处理所有创建逻辑。
2. 工厂方法模式结构
classDiagram
    interface IFactory {
        +CreateProduct(): IProduct
    }
    class FactoryA {
        +CreateProduct(): IProduct
    }
    class FactoryB {
        +CreateProduct(): IProduct
    }
    interface IProduct {
        +Use()
    }
    class ProductA {
        +Use()
    }
    class ProductB {
        +Use()
    }
    
    IFactory <|-- FactoryA
    IFactory <|-- FactoryB
    FactoryA --> ProductA
    FactoryB --> ProductB
    ProductA --|> IProduct
    ProductB --|> IProduct
  • 核心:抽象工厂接口 + 多个具体工厂类 + 多个产品类,一个工厂对应一个产品。

三、代码示例对比(支付场景)

1. 简单工厂模式实现
// 抽象产品
public interface IPayment
{
    string Pay(decimal amount);
}

// 具体产品
public class AlipayPayment : IPayment
{
    public string Pay(decimal amount) => $"支付宝支付{amount:C}";
}

public class WechatPayment : IPayment
{
    public string Pay(decimal amount) => $"微信支付{amount:C}";
}

// 核心:一个简单工厂类(集中创建逻辑)
public class PaymentSimpleFactory
{
    public IPayment CreatePayment(string paymentType)
    {
        return paymentType switch
        {
            "Alipay" => new AlipayPayment(),
            "Wechat" => new WechatPayment(),
            _ => throw new NotSupportedException("不支持的支付方式")
        };
    }
}

// 客户端调用
class Program
{
    static void Main()
    {
        var factory = new PaymentSimpleFactory();
        IPayment payment = factory.CreatePayment("Alipay");
        Console.WriteLine(payment.Pay(99));
    }
}
2. 工厂方法模式实现
// 抽象产品(同简单工厂)
public interface IPayment
{
    string Pay(decimal amount);
}

// 具体产品(同简单工厂)
public class AlipayPayment : IPayment { /* 实现 */ }
public class WechatPayment : IPayment { /* 实现 */ }

// 抽象工厂
public interface IPaymentFactory
{
    IPayment CreatePayment();
}

// 具体工厂(一个工厂对应一个产品)
public class AlipayFactory : IPaymentFactory
{
    public IPayment CreatePayment() => new AlipayPayment();
}

public class WechatFactory : IPaymentFactory
{
    public IPayment CreatePayment() => new WechatPayment();
}

// 客户端调用
class Program
{
    static void Main()
    {
        IPaymentFactory factory = new AlipayFactory(); // 选择具体工厂
        IPayment payment = factory.CreatePayment();
        Console.WriteLine(payment.Pay(99));
    }
}

四、核心差异对比表

对比维度 简单工厂模式 工厂方法模式
工厂类数量 1 个(集中式) N 个(一个产品对应一个工厂)
抽象层 仅抽象产品,无抽象工厂 抽象产品 + 抽象工厂
开闭原则 不符合(新增产品需修改工厂的 switch) 符合(新增产品只需加工厂 + 产品,不修改原有)
代码复杂度 低(类少、逻辑集中) 高(类多、分层清晰)
扩展成本 高(改原有工厂代码,有风险) 低(仅新增类,无风险)
职责单一原则 违反(一个工厂负责所有产品创建) 符合(一个工厂只负责一个产品创建)
客户端依赖 依赖具体工厂类 + 抽象产品 依赖抽象工厂接口 + 抽象产品

五、适用场景对比

简单工厂模式适用场景
  • 产品类型极少且稳定(如仅 2-3 种,且长期不新增);
  • 项目快速迭代,优先追求简单,不考虑后续扩展;
  • 客户端只需传入参数即可获取产品,无需关心创建细节。
  • 示例:工具类创建(如仅支持 JSON/XML 两种格式解析)。
工厂方法模式适用场景
  • 产品类型多且需频繁扩展(如支付方式可能新增银联、ApplePay 等);
  • 项目追求可维护性、可扩展性,符合开闭原则;
  • 希望将不同产品的创建逻辑解耦(如支付宝和微信支付的初始化逻辑不同)。
  • 示例:日志框架(文件 / 数据库 / ES 日志)、导出工具(Excel/CSV/PDF)。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐