简单工厂模式属于创建型设计模式。它会定义一个用于创建对象的接口,然后根据条件去实例化哪一个类型,通常被实例化的类型都有一个公共的父类或接口。它使一个类的实例化延迟到子类。
其结构图如下:

Product是公共父类或者接口,ConcreteProduct为其子类。ConcreteCreator为创建类的工厂,提供了实例化对象的方法FactoryMethod(),其它对象在需要实例化的Product的时候,就不用自己创建,而是调用工厂中的FactoryMethod()方法来实例化。
应用场景:
例如我们要实现一个有加减乘除的计算器功能的程序。我们在用户输入之前是不可能知道我们应该实例化加法还是减法的,这个时候必须根据用户的输入去实例化具体对象,这个时候就可以使用该设计模式。
定义一个符号的父类
public class Operation
{ public double NumA { get; set; }
public double NumB { get; set; } public virtual double GetResult() { return 0; } }
然后设计对应的加减乘除相关类
// 加法 class OperationAdd : Operation { public override double GetResult() { return NumberA + NumberB; } } // 减法 class OperationSub : Operation { public override double GetResult() { return NumberA - NumberB; } } // 乘法 class OperationMul : Operation { public override double GetResult() { return NumberA * NumberB; } } // 除法 class OperationDiv : Operation { public override double GetResult() { if (NumberB == 0) throw new Exception("除数不能为0。"); 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; } case "/": { oper = new OperationDiv(); break; } } return oper; } }
这个时候就可以直接调用工厂来进行创建了
static void Main(string[] args) { try { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请选择运算符号(+、-、*、/):"); string strOperate = Console.ReadLine(); Console.Write("请输入数字B:"); string strNumberB = Console.ReadLine(); string strResult = ""; Operation oper; oper = OperationFactory.createOperate(strOperate); oper.NumberA = Convert.ToDouble(strNumberA); oper.NumberB = Convert.ToDouble(strNumberB); strResult = oper.GetResult().ToString(); Console.WriteLine("结果是:" + strResult); } catch (Exception ex) { Console.WriteLine("您的输入有错:" + ex.Message); } }
该模式将实例化对象的任务交给了工厂,用户只需要只要实例化的规则就可以了,而不用去管理具体实例化哪一个对象。但是该模式违反了开放封闭原则,如果我们要实例化新的对象,就必须修改工厂的方法。所以该模式通常用于实例化规则不经常改变的地方。
posted on
浙公网安备 33010602011771号