首页 > 代码库 > 简单工厂模式
简单工厂模式
一:软件设计的目标:是实现软件可维护,可扩展,可复用。灵活性好等功能。课本上通过活字印刷术讲述了面向对象编程的优点
二:样例:输入两个数和运算符来计算结果
将控制台输入和运算符运算分开实现即将业务层和界面逻辑分开,减少他们之间的耦合性。封装全部可能变化的部分。
Operation运算类
<span style="font-size:14px;"> public class Operation { public static double GetResult(double,numberA,double numberB,string operate) double result = 0d switch(operate) { case "+": resule = numberA+numberB; break; case "-": resule = numberA-numberB; break; case "*": resule = numberA*numberB; break; case "/": resule = numberA/numberB; break; } return result; } </span>client代码
<span style="font-size:14px;"> 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 = "" strResult =Convert.Tostring(Operation.GetResult (Convert.ToDouble(strNumberA,Convert.ToDouble(strNumberB),strOperate));) Console.WriteLine("结果是:"+strResult); Console.ReadLine(); } catch(Excepation ex) { Console.WriteLine("你的输入有错:"+ex.Message); } }</span>上述的代码实现了对运算类的封装。可是如过加入一个开根号(sqrt)运算,在operation类中的switch中加一个分支,可是其它的四个运算不是必需改动但代码却參与了编译。在改动的时候easy让没有问题的代码出错,暴露了其它重要代码。
怎样提高代码的灵活性便于实现代码的改动和扩张?方法使用面向对象的继承和多态,运算符子类继承运算类,子类重写父类的运算方法,通过工厂来实例化运算子类。以下说下简单工厂模型。
三:简单工厂模型
1定义:专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常依据一个条件(參数)来返回不同的类的实例。
2内容:
工厂角色(Creator)
是简单工厂模式的核心。它负责实现创建全部详细产品类的实例。工厂类能够被外界直接调用,创建所需的产品对象。
抽象产品角色(Product)
是全部详细产品角色的父类,它负责描写叙述全部实例所共同拥有的公共接口。
详细产品角色(Concrete Product)
继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。
工厂类返回的都是该角色的某一详细产品。
3uml图
样例重构后的代码例如以下:
4.(1)运算类
<span style="font-size:14px;">Public class Operation { private double _numberA =0; private double _numberB =0; public double NumberA { get { return _numberA;} set( _numerA = value;) } public double NumberB { get { return _numberB;} set( _numerB = value;) } public victual double GerResult() { double result = 0; return result; } }</span>
4.(2)子类继承运算类
class OperationAdd :Operation { public override double GetResult() { double result = 0 ; result = _numberA + numberB; return result; } } class OperationSub:Operation { public override double GetResult() { double result = 0; result = numberA - numberB; return result; } } class OperationMul : Operation { public override double GetResult() { double result = 0; result = numberA * numberB; return result; } } class OperationDiv:Operation { public override double GetResult() { double result = 0; if(numberB==0) throw new Exception("除数不能为0。"); result = numberA /numberB; return result; } }
4.(3)工厂实例化运算符子类
<span style="font-size:14px;">Public class OperationFactory { public static Operation createOperation(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 } }</span>控制台仅仅要输入相应的运算符就会实例化相应的对象,通过多态返回父类的方式实现计算器的结果。
4.(4)控制台
<span style="font-size:14px;">Operation oper; Oper = OperationFactory.createOperation("+"); Oper.NumberA=1; Oper.numberB=2; Double result = oper.GerResult(); </span>最后的代码假设要改动+运算类的内容仅仅须要改动OperationAdd类就能够,假设要加入其它的运算类,仅仅须要添加一个运算类
并在switch中添加对应的实例化对象。
四.总结:简单工厂模式可以依据外界给定的信息,决定到底应该创建哪个详细类的对象。通过它,外界与详细类隔离开来,偶合性低。明白区分了各自的职责和权力,有利于整个软件体系结构的优化。
简单工厂模式