简单工厂、工厂、抽象工厂模式
-
-
- [1. **简单工厂模式(Simple Factory)**](#1. 简单工厂模式(Simple Factory))
- [2. **工厂方法模式(Factory Method)**](#2. 工厂方法模式(Factory Method))
- [3. **抽象工厂模式(Abstract Factory)**](#3. 抽象工厂模式(Abstract Factory))
- 对比总结
-
以下是三种工厂模式在C#中的实现与对比分析,结合具体代码示例说明:
1. 简单工厂模式(Simple Factory)
- 核心:通过一个静态工厂方法根据参数返回不同产品实例。
- C#示例(支付场景):
csharp
// 抽象产品
public interface IPayment { void Pay(decimal amount); }
// 具体产品
public class Alipay : IPayment { public void Pay(decimal amount) => Console.WriteLine($"支付宝支付:{amount}元"); }
public class WeChatPay : IPayment { public void Pay(decimal amount) => Console.WriteLine($"微信支付:{amount}元"); }
// 工厂类
public class PaymentFactory {
public static IPayment Create(string type) {
return type switch {
"alipay" => new Alipay(),
"wechat" => new WeChatPay(),
_ => throw new ArgumentException("不支持的支付方式")
};
}
}
// 客户端调用
var payment = PaymentFactory.Create("alipay");
payment.Pay(100);
- 特点 :
- ✅ 客户端与具体类解耦。
- ❌ 新增支付方式需修改工厂类,违反开闭原则。
2. 工厂方法模式(Factory Method)
- 核心:将对象创建延迟到子类,每个产品对应一个工厂。
- C#示例(日志记录器场景):
csharp
// 抽象产品
public interface ILogger { void Log(string message); }
// 具体产品
public class FileLogger : ILogger { public void Log(string message) => Console.WriteLine($"文件日志:{message}"); }
public class DatabaseLogger : ILogger { public void Log(string message) => Console.WriteLine($"数据库日志:{message}"); }
// 抽象工厂
public interface ILoggerFactory { ILogger CreateLogger(); }
// 具体工厂
public class FileLoggerFactory : ILoggerFactory {
public ILogger CreateLogger() => new FileLogger();
}
public class DatabaseLoggerFactory : ILoggerFactory {
public ILogger CreateLogger() => new DatabaseLogger();
}
// 客户端调用
ILoggerFactory factory = new FileLoggerFactory();
var logger = factory.CreateLogger();
logger.Log("测试日志");
- 特点 :
- ✅ 新增日志类型只需添加新工厂类,符合开闭原则。
- ❌ 类数量随产品增加而增多。
3. 抽象工厂模式(Abstract Factory)
- 核心:创建一组相关产品族(如跨平台UI组件)。
- C#示例(UI组件场景):
csharp
// 抽象产品族
public interface IButton { void Render(); }
public interface ITextBox { void Input(); }
// Windows产品族
public class WinButton : IButton { public void Render() => Console.WriteLine("Windows风格按钮"); }
public class WinTextBox : ITextBox { public void Input() => Console.WriteLine("Windows风格文本框输入"); }
// Mac产品族
public class MacButton : IButton { public void Render() => Console.WriteLine("Mac风格按钮"); }
public class MacTextBox : ITextBox { public void Input() => Console.WriteLine("Mac风格文本框输入"); }
// 抽象工厂
public interface IUIFactory {
IButton CreateButton();
ITextBox CreateTextBox();
}
// 具体工厂
public class WinUIFactory : IUIFactory {
public IButton CreateButton() => new WinButton();
public ITextBox CreateTextBox() => new WinTextBox();
}
public class MacUIFactory : IUIFactory {
public IButton CreateButton() => new MacButton();
public ITextBox CreateTextBox() => new MacTextBox();
}
// 客户端调用
IUIFactory factory = new WinUIFactory();
var button = factory.CreateButton();
button.Render();
- 特点 :
- ✅ 保证同一产品族的兼容性(如所有Windows组件风格一致)。
- ❌ 扩展新产品类型(如
ICheckbox
)需修改所有工厂接口。
对比总结
维度 | 简单工厂 | 工厂方法 | 抽象工厂 |
---|---|---|---|
创建目标 | 单一产品 | 单一产品 | 一组相关产品族 |
扩展性 | 需修改工厂类 | 新增工厂子类 | 新增产品族易,扩展产品类型难 |
适用场景 | 支付方式选择 | 日志记录器 | 跨平台UI套件 |
💡 演进逻辑:
- 简单工厂 → 工厂方法:解决开闭原则问题。
- 工厂方法 → 抽象工厂:支持产品族创建。
引用链接:
2.c#简单工厂、工厂方法与抽象工厂的区别分析 - CSDN博客
4.2-1 简单工厂模式(Simple Factory) - bravo1988
6.《C#设计模式》 工厂三兄弟之 【简单工厂模式】,【工厂方法模式】,【抽象工厂模式】 - CSDN
7.C#设计模式(4)------抽象工厂模式 - CSDN
8.设计模式学习笔记(三)简单工厂、工厂方法和抽象工厂之间的区别 - 腾讯云
10.深入理解23种设计模式之五分钟学会工厂&抽象工厂模式 - 哔哩哔哩
15.7、【设计模式】之3种工厂模式的优缺点,使用场景,以及代码示例。 - 哔哩哔哩
18.千锋java培训:Java设计模式视频教程-创建型模式-简单工厂模式 - 千锋教育