csharp:gof23种设计模式:简单工厂模式

简单工厂模式 (Simple Factory Pattern) - C#

简单工厂模式虽然不属于 GoF 23种设计模式(它是工厂方法模式的一个特例或简化版),但在实际开发中非常常用。它主要用于管理对象的创建过程。

核心思想:定义一个工厂类,根据传入的参数不同返回不同类的实例。

被创建的实例通常都具有共同的父类或实现同一个接口。客户(Client)只需要知道参数,而不需要关心对象的创建细节。

角色划分

  • Factory (工厂类): 核心部分,负责实现创建所有实例的内部逻辑。
  • Product (抽象产品): 所有具体产品的父类或接口。
  • ConcreteProduct (具体产品): 工厂类所创建的具体对象。

简单工厂模式结构

Client (调用者)
请求创建对象
Factory (工厂类)
+ CreateProduct(type): IProduct
Product A
具体实现 A
Product B
具体实现 B

我们需要做一个简单的计算器,能够进行加法、减法、乘法运算。

  • 抽象产品:运算类 (Operation)
  • 具体产品:加法类 (Add)、减法类 (Sub)、乘法类 (Mul)
  • 工厂:运算工厂 (OperationFactory)

创建一个抽象类或接口,定义所有具体产品共有的方法。

// 抽象产品:运算类
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}");
        }
    }
}
优点 缺点
解耦:客户端免除了创建对象的责任,只负责“消费”对象。 违背开闭原则 (OCP):如果需要增加新的运算(如除法),必须修改工厂类的 `switch-case` 逻辑。
代码清晰:将对象创建的复杂逻辑封装在工厂类中。 工厂类职责过重:如果产品过多,工厂类逻辑会变得非常复杂,一旦出错可能导致系统崩溃。
请输入您的评论. 可以使用维基语法:
 

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • csharp/gof23种设计模式/简单工厂模式.txt
  • 最后更改: 2025/12/22 10:51
  • 张叶安