显示页面讨论反向链接回到顶部 本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 ====== 简单工厂模式 (Simple Factory Pattern) - C# ====== 简单工厂模式虽然不属于 GoF 23种设计模式(它是工厂方法模式的一个特例或简化版),但在实际开发中非常常用。它主要用于管理对象的创建过程。 ===== 1. 原理 ===== **核心思想**:定义一个工厂类,根据传入的参数不同返回不同类的实例。 被创建的实例通常都具有共同的父类或实现同一个接口。客户(Client)只需要知道参数,而不需要关心对象的创建细节。 **角色划分**: * **Factory (工厂类)**: 核心部分,负责实现创建所有实例的内部逻辑。 * **Product (抽象产品)**: 所有具体产品的父类或接口。 * **ConcreteProduct (具体产品)**: 工厂类所创建的具体对象。 ===== 2. 结构图解 (UML) ===== <html> <div style="font-family: 'Segoe UI', Arial, sans-serif; background-color: #f4f4f4; padding: 20px; border-radius: 8px; border: 1px solid #ddd; max-width: 600px; margin: 20px 0;"> <h4 style="text-align:center; margin-top:0; color:#333;">简单工厂模式结构</h4> <!-- Client --> <div style="text-align: center; margin-bottom: 20px;"> <div style="display: inline-block; background: #e1f5fe; border: 2px solid #0288d1; padding: 10px 20px; border-radius: 4px; font-weight: bold; color: #01579b;"> Client (调用者) </div> <div style="height: 20px; border-left: 2px dashed #999; width: 0; margin: 0 auto;"></div> <div style="color: #666; font-size: 12px;">请求创建对象</div> <div style="height: 10px; width: 0; border-left: 2px solid #333; border-bottom: 2px solid #333; transform: rotate(-45deg); margin: -5px auto 0 auto; position: relative; left: -1px;"></div> </div> <!-- Factory --> <div style="text-align: center; margin-bottom: 30px;"> <div style="display: inline-block; background: #fff9c4; border: 2px solid #fbc02d; padding: 15px; border-radius: 4px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);"> <div style="font-weight: bold; border-bottom: 1px solid #fbc02d; margin-bottom: 5px; color: #f57f17;">Factory (工厂类)</div> <div style="font-size: 13px; font-family: monospace;">+ CreateProduct(type): IProduct</div> </div> </div> <!-- Arrows split --> <div style="position: relative; height: 30px; margin-bottom: 10px;"> <div style="position: absolute; left: 50%; top: 0; height: 15px; border-left: 2px solid #333;"></div> <div style="position: absolute; left: 25%; top: 15px; width: 50%; border-top: 2px solid #333;"></div> <div style="position: absolute; left: 25%; top: 15px; height: 15px; border-left: 2px solid #333;"></div> <div style="position: absolute; left: 75%; top: 15px; height: 15px; border-left: 2px solid #333;"></div> </div> <!-- Products --> <div style="display: flex; justify-content: space-around;"> <!-- Product A --> <div style="background: #e8f5e9; border: 2px solid #388e3c; padding: 10px; border-radius: 4px; width: 40%; text-align: center;"> <div style="font-weight: bold; color: #1b5e20;">Product A</div> <div style="font-size: 12px; color: #666;">具体实现 A</div> </div> <!-- Product B --> <div style="background: #e8f5e9; border: 2px solid #388e3c; padding: 10px; border-radius: 4px; width: 40%; text-align: center;"> <div style="font-weight: bold; color: #1b5e20;">Product B</div> <div style="font-size: 12px; color: #666;">具体实现 B</div> </div> </div> </div> </html> ===== 3. 案例场景:计算器 ===== 我们需要做一个简单的计算器,能够进行加法、减法、乘法运算。 * **抽象产品**:运算类 (Operation) * **具体产品**:加法类 (Add)、减法类 (Sub)、乘法类 (Mul) * **工厂**:运算工厂 (OperationFactory) ===== 4. 操作步骤与 C# 代码 ===== ==== 第一步:定义抽象产品 ==== 创建一个抽象类或接口,定义所有具体产品共有的方法。 <code csharp> // 抽象产品:运算类 public abstract class Operation { public double NumberA { get; set; } public double NumberB { get; set; } // 抽象方法,由子类实现具体的运算逻辑 public abstract double GetResult(); } </code> ==== 第二步:定义具体产品 ==== 创建具体的运算类,继承自抽象产品。 <code csharp> // 具体产品:加法 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; } } </code> ==== 第三步:定义工厂类 ==== 这是简单工厂模式的核心,根据传入的字符串(运算符),决定实例化哪个对象。 <code csharp> // 工厂类 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; } } </code> ==== 第四步:客户端调用 ==== 客户端不需要知道 `OperationAdd` 或 `OperationSub` 的存在,只需要找工厂要对象。 <code csharp> 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}"); } } } </code> ===== 5. 优缺点总结 ===== ^ 优点 ^ 缺点 ^ |解耦:客户端免除了创建对象的责任,只负责“消费”对象。 |违背开闭原则 (OCP):如果需要增加新的运算(如除法),必须修改工厂类的 `switch-case` 逻辑。 | |代码清晰:将对象创建的复杂逻辑封装在工厂类中。 |工厂类职责过重:如果产品过多,工厂类逻辑会变得非常复杂,一旦出错可能导致系统崩溃。 | 登录 Detach Close 该主题尚不存在 您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。 csharp/gof23种设计模式/简单工厂模式.txt 最后更改: 2025/12/22 10:51由 张叶安 登录