C#工厂方法模式和简单工厂模式的区别
·
一、先明确两个模式的核心定义
| 模式类型 | 核心定义 |
|---|---|
| 简单工厂模式 | 用一个工厂类封装所有产品的创建逻辑,通过参数(如字符串 / 枚举)决定创建哪种产品 |
| 工厂方法模式 | 定义抽象工厂接口,将产品创建逻辑分散到多个具体工厂类中(一个工厂对应一个产品) |
二、核心结构对比(可视化)
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)。
更多推荐

所有评论(0)