《大话设计模式》第一章:简单工厂模式 代码
目标写一个计算器,第一个输入数字,第二个输入运算符号(+,-,*,/),第三个输入第二个数字,然后回车得到结果。
首先是Operate类,2个属性,一个得到结果的方法。
public class Operate { public Double strNumberA { get; set; } public Double strNumberB { get; set; } public virtual Double GetResult() { return 0; } }
再是运算加的方法OperateAdd,继承于Operate,通过改写GerResult来实现不同运算,其余的雷同。
public class OperateAdd : Operate { public override double GetResult() { return strNumberA + strNumberB; } }
class OperateSub : Operate { public override double GetResult() { return strNumberA - strNumberB; } }
class OperateMul : Operate { public override double GetResult() { return strNumberA * strNumberB; } }
class OperateDiv : Operate { public override double GetResult() { if (strNumberB == 0) throw new Exception("除数不能为0"); return strNumberA / strNumberB; } }
此时构造一个工厂类,通过运算符来实例化对应操作类。
public class OperateFactory { /// <summary> /// 根据运算符来实例化对应操作方法 /// </summary> /// <param name="strOperate"></param> /// <returns></returns> public static Operate CrateOperate(string strOperate) { Operate op = null; switch (strOperate) { case "+": op = new OperateAdd(); break; case "-": op = new OperateSub(); break; case "*": op = new OperateMul(); break; case "/": op = new OperateDiv(); break; } return op; } }
入口函数如下:
static void Main(string[] args) { string strOperate; Double strNumberA; Double strNumberB; strNumberA = Convert.ToDouble(Console.ReadLine()); strOperate = Console.ReadLine(); strNumberB = Convert.ToDouble(Console.ReadLine()); Operate op; op = OperateFactory.CrateOperate(strOperate); op.strNumberA = strNumberA; op.strNumberB = strNumberB; try { Console.WriteLine("结果是:" + op.GetResult()); } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); } Console.ReadKey(); }
如此写法,在添加功能的时候只用添加一个继承于Operate的类,改写GetResult方法,工厂适配器添加一个case即可。
工厂模式运用非常广泛,封装,继承,多态,委托的灵活运用跟一个程序员是否真正了解到面向对象有直接的关系。