简单工厂模式

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. 适用场景:产品类型较少、创建逻辑简单,且不需要频繁扩展的场景(如果产品多且易扩展,建议用工厂方法模式)。
相关推荐
凌波粒13 分钟前
LeetCode--108.将有序数组转换为二叉搜索树(二叉树)
算法·leetcode·职场和发展
liulilittle13 分钟前
KCC:在 BBR 思路上的一次探索
网络·tcp/ip·算法·bbr·通信·拥塞控制·kcc
码云骑士17 分钟前
13-列表append的底层真相(上)-listobject源码中的预分配策略
开发语言·python
浦信仿真大讲堂35 分钟前
达索系统SIMULIA Abaqus 2026接触和约束的增强新功能介绍
人工智能·python·算法·仿真软件·达索软件
点云侠1 小时前
PCL 生成三棱锥点云
c++·算法·最小二乘法
兰令水1 小时前
leecodecode【面试150】【2026.6.13打卡-java版本】
java·算法·leetcode
临沂堇1 小时前
刷题日志 | Leetcode Hot 100 哈希
算法·leetcode·哈希算法
.道阻且长.1 小时前
C++ string 操作指南:接口解析
java·c语言·开发语言·c++
蚰蜒螟1 小时前
Java 对象的内存密语:从字段偏移量计算到 Unsafe 访问的完整链路
java·开发语言
玉小格1 小时前
一次关于Python的总结
算法