设计模式中。计算器的加减乘除或再外加其它的运算时,对其进行实例化,就能够用到简单工厂模式。
用一个单独的类来做这个创造实例的过程,这就是工厂。
从《大化设计模式》中,思维在不断的碰撞,让我们在来回想一下计算器的编写过程中一步步的关键变化。
如题“用面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符,得到结果”
变动 |
长处 |
不足 |
|
---|---|---|---|
面向过程 |
|
|
|
|
再写一个windows程序中计算器 也可直接复用运算类 |
若让小菜加一个开跟运算,他可趁机将自己工资部分代码改动 |
由于。全部运算都在一起。改动一个可能影响还有一个 |
计算部分分为运算类和子类 |
|
|
|
|
仅仅要输入运算符号,工厂就能实例化出合适的对象也易于以后对算法的添加改动。 |
|
这就是简单工厂模式 |
我们用UML图来看看它的模式
后记:真心认为小菜的觉悟好高-_-|||,只是在他改变的过程中,我们也一次次的体会着编程的艺术之美。一切源于生活,学习也是如此啊,回归生活,就会多一份韵味。
一切也明朗和easy起来。
心想。假设我有这样一个工厂,我会用它来生产什么呢?
情景一:各地空气质量。
关心一下廊坊的质量,再看一看北京的,当然还有老家的空气质量也要特
别关注啦。我用一个工厂“生产”它们。等哪天我去了海南照样能够简
单扩展。就拿来用。
情景二:11期的在作品展宣传。
也给他们做一个工厂模式,可能几天里,周一周二的没课的人多,就多安排几
个地去宣传。
周三周四没课的人少。就少安排几个地方。
可是他们的流程都一样的。
先定义一个父类“流程”。在定义子类中去重写方法。依据各自的不同地点或方式再去重写。用一个工厂去实例化它,这样。哪一天10期的也參加宣传,就能够再工厂中加入一个类。
并实例就好了。
情景三:五一出游。
同学们都在准备着到哪去玩呢。
我们也来给旅行社做个工厂模式吧。
旅行社有5条路线。
北京一日游。天津一日游等。界面方面,涉及到游客姓名 人数 时间等,这样不管在windows 还是在web 在手机上都能够复用。业务方面他们都会涉及票价,行程,注意事项,做一个基类,然后子类中再去重写方法。用简单工厂模式去做。假设学生们都反映想去白洋淀,旅行社还能够再不影响其他类时进行加入。假设最近优惠打折也非常灵活的改动。
须要注意的是,假设再加入别的运算类如幂运算。要先加幂运算的类,然后去更改工厂的方法,其中加‘case’语句来推断。这样,实际上是对扩展开放了。也对改动开放了,也就是违背了“开放-封闭”原则。
改正也非常easy,用反射技术来去除switch或if。解除分支推断带来的耦合。 欢迎关注我的设计模式系列博客~
附:下面是终于计算器的艺术化身。让我们一起来体会自始至终它的变化和动态之美。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //用一个单独的类来做这个创造实例的过程 public class Operation { private double _numberA=0; private double _numberB=0; public double NumberA { get{return _numberA;} set{_numberA=value;} } public double NumberB { get{return _numberB;} set{_numberB=value;} } public virtual double GetResult() { double result =0; return result; } /// <summary> /// 继承后重写result /// </summary> 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 { double result=0; if(NumberB==0) throw new Exception ("除数不能为0."); result =NumberA/NumberB; retrun result; ) } /// <summary> /// 简单工厂模式 /// </summary> 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; } } /// <summary> /// 界面的实现 /// </summary> Operation oper; oper =OperationFactory.createOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result=oper.GetResult(); }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
原文:http://www.cnblogs.com/hrhguanli/p/4733222.html