C# 中的简易工厂模式(简单工厂模式),这是一种创建型设计模式,核心是通过一个单独的工厂类来封装对象的创建逻辑,让调用方无需关心具体对象的创建细节。
一、简易工厂模式核心思路
简单工厂模式包含三个核心角色:
- 产品抽象:定义产品的公共接口 / 抽象类,规范所有具体产品的行为。
- 具体产品:实现产品抽象的具体类,是工厂最终要创建的对象。
- 工厂类:提供一个静态方法(也可非静态),根据传入的参数创建并返回对应的具体产品实例。
二、完整代码示例(以 "计算器" 为例)
下面用一个计算器的例子演示简易工厂模式,支持加减运算,后续可轻松扩展乘除:
csharp
运行
using System;
// 1. 产品抽象:定义运算的公共接口
public abstract class Operation
{
// 运算数A
public double NumberA { get; set; }
// 运算数B
public double NumberB { get; set; }
// 抽象方法:计算结果(由具体产品实现)
public abstract double GetResult();
}
// 2. 具体产品:加法运算
public class OperationAdd : Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
}
// 2. 具体产品:减法运算
public class OperationSub : Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}
// 3. 工厂类:封装对象创建逻辑
public class OperationFactory
{
/// <summary>
/// 根据运算符号创建对应的运算实例
/// </summary>
/// <param name="operate">运算符号:+、-</param>
/// <returns>对应的运算对象</returns>
public static Operation CreateOperation(string operate)
{
Operation operation = null;
switch (operate)
{
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
default:
throw new ArgumentException("不支持的运算符号", nameof(operate));
}
return operation;
}
}
// 测试代码
class Program
{
static void Main(string[] args)
{
try
{
// 调用工厂创建加法对象
Operation addOp = OperationFactory.CreateOperation("+");
addOp.NumberA = 10;
addOp.NumberB = 5;
Console.WriteLine($"10 + 5 = {addOp.GetResult()}"); // 输出:10 + 5 = 15
// 调用工厂创建减法对象
Operation subOp = OperationFactory.CreateOperation("-");
subOp.NumberA = 10;
subOp.NumberB = 5;
Console.WriteLine($"10 - 5 = {subOp.GetResult()}"); // 输出:10 - 5 = 5
}
catch (ArgumentException ex)
{
Console.WriteLine("错误:" + ex.Message);
}
}
}
三、代码关键解释
-
产品抽象(Operation):定义了所有运算类的公共属性(NumberA、NumberB)和抽象方法(GetResult),确保所有具体运算类都遵循统一的行为规范。
-
具体产品(OperationAdd/OperationSub):分别实现了加法和减法的具体计算逻辑,是工厂最终要创建的对象。
-
工厂类(OperationFactory):
- 核心方法
CreateOperation接收运算符号参数,通过switch语句创建对应的具体产品实例。 - 调用方只需传入符号,无需直接
new具体运算类,完全解耦了 "对象创建" 和 "业务逻辑"。
- 核心方法
-
扩展说明:如果要新增乘法运算,只需:
- 新增
OperationMul类(继承 Operation,实现乘法逻辑); - 在工厂类的
switch中添加"*"的分支即可; - 调用方代码无需任何修改,符合 "开闭原则"(对扩展开放,对修改关闭)。
- 新增
四、简易工厂模式的优缺点
优点:
- 解耦:调用方无需知道具体产品的创建细节,只需关注工厂的调用;
- 便于维护:对象创建逻辑集中在工厂类,修改时只需改工厂,无需改所有调用处;
- 便于扩展:新增产品时,只需新增具体产品类 + 修改工厂类,调用方无感知。
缺点:
- 工厂类职责过重:所有产品的创建逻辑都集中在工厂,产品越多,工厂类越复杂;
- 违背 "开闭原则":新增产品时需要修改工厂类的
switch/if逻辑(这也是简易工厂和工厂方法模式的核心区别)。
总结
- 简易工厂模式的核心是通过工厂类封装对象创建逻辑,调用方通过参数获取具体产品实例;
- 核心结构:产品抽象 → 具体产品 → 工厂类(创建逻辑);
- 适用场景:产品类型较少、创建逻辑简单,且不需要频繁扩展的场景(如果产品多且易扩展,建议用工厂方法模式)。