简单工厂模式

C# 中的简易工厂模式(简单工厂模式),这是一种创建型设计模式,核心是通过一个单独的工厂类来封装对象的创建逻辑,让调用方无需关心具体对象的创建细节。

一、简易工厂模式核心思路

简单工厂模式包含三个核心角色:

  1. 产品抽象:定义产品的公共接口 / 抽象类,规范所有具体产品的行为。
  2. 具体产品:实现产品抽象的具体类,是工厂最终要创建的对象。
  3. 工厂类:提供一个静态方法(也可非静态),根据传入的参数创建并返回对应的具体产品实例。

二、完整代码示例(以 "计算器" 为例)

下面用一个计算器的例子演示简易工厂模式,支持加减运算,后续可轻松扩展乘除:

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);
        }
    }
}

三、代码关键解释

  1. 产品抽象(Operation):定义了所有运算类的公共属性(NumberA、NumberB)和抽象方法(GetResult),确保所有具体运算类都遵循统一的行为规范。

  2. 具体产品(OperationAdd/OperationSub):分别实现了加法和减法的具体计算逻辑,是工厂最终要创建的对象。

  3. 工厂类(OperationFactory)

    • 核心方法CreateOperation接收运算符号参数,通过switch语句创建对应的具体产品实例。
    • 调用方只需传入符号,无需直接new具体运算类,完全解耦了 "对象创建" 和 "业务逻辑"。
  4. 扩展说明:如果要新增乘法运算,只需:

    • 新增OperationMul类(继承 Operation,实现乘法逻辑);
    • 在工厂类的switch中添加"*"的分支即可;
    • 调用方代码无需任何修改,符合 "开闭原则"(对扩展开放,对修改关闭)。

四、简易工厂模式的优缺点

优点:
  • 解耦:调用方无需知道具体产品的创建细节,只需关注工厂的调用;
  • 便于维护:对象创建逻辑集中在工厂类,修改时只需改工厂,无需改所有调用处;
  • 便于扩展:新增产品时,只需新增具体产品类 + 修改工厂类,调用方无感知。
缺点:
  • 工厂类职责过重:所有产品的创建逻辑都集中在工厂,产品越多,工厂类越复杂;
  • 违背 "开闭原则":新增产品时需要修改工厂类的switch/if逻辑(这也是简易工厂和工厂方法模式的核心区别)。

总结

  1. 简易工厂模式的核心是通过工厂类封装对象创建逻辑,调用方通过参数获取具体产品实例;
  2. 核心结构:产品抽象 → 具体产品 → 工厂类(创建逻辑);
  3. 适用场景:产品类型较少、创建逻辑简单,且不需要频繁扩展的场景(如果产品多且易扩展,建议用工厂方法模式)。
相关推荐
菜鸡儿齐2 小时前
leetcode-最小栈
java·算法·leetcode
岛雨QA2 小时前
常用十种算法「Java数据结构与算法学习笔记13」
数据结构·算法
weiabc2 小时前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
铸人2 小时前
大数分解的Shor算法-C#
开发语言·算法·c#
问好眼2 小时前
《算法竞赛进阶指南》0x01 位运算-3.64位整数乘法
c++·算法·位运算·信息学奥赛
yyjtx2 小时前
DHU上机打卡D31
开发语言·c++·算法
GEO行业研究员2 小时前
《认知锚定与路径锁死:基于爱搜光年模型的AI决策链条风险放大机制监测》
人工智能·算法·ai搜索优化·geo优化·医疗geo·医疗geo优化
wefg12 小时前
【算法】单调栈和单调队列
数据结构·算法
岛雨QA2 小时前
图「Java数据结构与算法学习笔记12」
数据结构·算法