简单工厂模式

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. 适用场景:产品类型较少、创建逻辑简单,且不需要频繁扩展的场景(如果产品多且易扩展,建议用工厂方法模式)。
相关推荐
啊我不会诶1 分钟前
2024北京市赛补题
c++·算法
shehuiyuelaiyuehao2 分钟前
算法13,滑动窗口,水果成篮
算法·哈希算法·散列表
智慧物业老杨2 分钟前
物业数智化转型实战:从单一服务到综合解决方案的技术落地路径
人工智能·算法·ai
夏末蝉未鸣015 分钟前
Sort-Merge Join【排序连接算法】详解(python代码实现,以FULL JOIN为例)
数据结构·算法
tjl521314_2113 分钟前
01C++ 分离编译与多文件编程
前端·c++·算法
_日拱一卒14 分钟前
LeetCode:23合并K个升序链表
java·数据结构·算法·leetcode·链表·职场和发展
cany100014 分钟前
C++ -- 泛型编程
java·开发语言·c++
格林威16 分钟前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附C++ 实战演示
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
哆啦刘小洋16 分钟前
【LeetCode每日一题】:2033(贪心+快速排序魔改)
算法·leetcode
WolfGang00732119 分钟前
代码随想录算法训练营 Day48 | 图论 part06
算法·图论