====== 简单工厂模式 (Simple Factory Pattern) - C# ====== 简单工厂模式虽然不属于 GoF 23种设计模式(它是工厂方法模式的一个特例或简化版),但在实际开发中非常常用。它主要用于管理对象的创建过程。 ===== 1. 原理 ===== **核心思想**:定义一个工厂类,根据传入的参数不同返回不同类的实例。 被创建的实例通常都具有共同的父类或实现同一个接口。客户(Client)只需要知道参数,而不需要关心对象的创建细节。 **角色划分**: * **Factory (工厂类)**: 核心部分,负责实现创建所有实例的内部逻辑。 * **Product (抽象产品)**: 所有具体产品的父类或接口。 * **ConcreteProduct (具体产品)**: 工厂类所创建的具体对象。 ===== 2. 结构图解 (UML) =====
// 抽象产品:运算类
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` 逻辑。 |
|代码清晰:将对象创建的复杂逻辑封装在工厂类中。 |工厂类职责过重:如果产品过多,工厂类逻辑会变得非常复杂,一旦出错可能导致系统崩溃。 |