简单工厂模式 (Simple Factory Pattern) - C#
简单工厂模式虽然不属于 GoF 23种设计模式(它是工厂方法模式的一个特例或简化版),但在实际开发中非常常用。它主要用于管理对象的创建过程。
1. 原理
核心思想:定义一个工厂类,根据传入的参数不同返回不同类的实例。
被创建的实例通常都具有共同的父类或实现同一个接口。客户(Client)只需要知道参数,而不需要关心对象的创建细节。
角色划分:
- Factory (工厂类): 核心部分,负责实现创建所有实例的内部逻辑。
- Product (抽象产品): 所有具体产品的父类或接口。
- ConcreteProduct (具体产品): 工厂类所创建的具体对象。
2. 结构图解 (UML)
简单工厂模式结构
Client (调用者)
请求创建对象
Factory (工厂类)
+ CreateProduct(type): IProduct
Product A
具体实现 A
Product B
具体实现 B
3. 案例场景:计算器
我们需要做一个简单的计算器,能够进行加法、减法、乘法运算。
- 抽象产品:运算类 (Operation)
- 具体产品:加法类 (Add)、减法类 (Sub)、乘法类 (Mul)
- 工厂:运算工厂 (OperationFactory)
4. 操作步骤与 C# 代码
第一步:定义抽象产品
创建一个抽象类或接口,定义所有具体产品共有的方法。
// 抽象产品:运算类 public abstract class Operation { public double NumberA { get; set; } public double NumberB { get; set; } // 抽象方法,由子类实现具体的运算逻辑 public abstract double GetResult(); }
第二步:定义具体产品
创建具体的运算类,继承自抽象产品。
// 具体产品:加法 public class OperationAdd : Operation { public override double GetResult() { return NumberA + NumberB; } } // 具体产品:减法 public class OperationSub : Operation { public override double GetResult() { return NumberA - NumberB; } } // 具体产品:乘法 public class OperationMul : Operation { public override double GetResult() { return NumberA * NumberB; } }
第三步:定义工厂类
这是简单工厂模式的核心,根据传入的字符串(运算符),决定实例化哪个对象。
// 工厂类 public class OperationFactory { public static Operation CreateOperate(string operate) { Operation oper = null; switch (operate) { case "+": oper = new OperationAdd(); break; case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; default: throw new Exception("不支持的运算符"); } return oper; } }
第四步:客户端调用
客户端不需要知道 `OperationAdd` 或 `OperationSub` 的存在,只需要找工厂要对象。
class Program { static void Main(string[] args) { try { // 1. 告诉工厂我们要进行 "+" 运算 Operation oper = OperationFactory.CreateOperate("+"); // 2. 设置数据 oper.NumberA = 10; oper.NumberB = 20; // 3. 获取结果 double result = oper.GetResult(); Console.WriteLine($"结果是: {result}"); // 输出: 结果是: 30 } catch(Exception ex) { Console.WriteLine($"发生错误: {ex.Message}"); } } }
5. 优缺点总结
| 优点 | 缺点 |
|---|---|
| 解耦:客户端免除了创建对象的责任,只负责“消费”对象。 | 违背开闭原则 (OCP):如果需要增加新的运算(如除法),必须修改工厂类的 `switch-case` 逻辑。 |
| 代码清晰:将对象创建的复杂逻辑封装在工厂类中。 | 工厂类职责过重:如果产品过多,工厂类逻辑会变得非常复杂,一旦出错可能导致系统崩溃。 |