我们由一个计算器谈起:
实现一个计算器,无非要考虑两件事:用户输入,和运算。
其中用户输入就是两个数,我们做一个界面来接受这两个数即可。
而运算,就是一个运算符,或者说是一个算法。
我们可以定义一个类叫Algorithm,把所有的加减乘除等等运算全写在里面。但这样显然是不妥的,比如说我想扩展一个平方运算。那么我要同时暴露以前写过的所有运算,这样很不安全,也不符合面向对象的开放-封闭原则(即面向修改封闭,面向拓展开放)。
那么让我们思考一下,这些运算有一个什么特点呢?
没错,它们都需要两个数和一个结果。
那么,我们就可以定义一个基类:
public class Operation
{
public double _numA=0;
public double _numB=0;
public virtual double GetResult()
{
double result=0;
return result;
}
}
然后我们在定义四个运算类(OperaionAdd、OperaionSub、OperaionMult、OperaionDiv)去继承并实现这个基类就行了。
接着我们去根据用户的选择,去实例化出要使用的运算类即可实现运算。需要注意的一点是,这个判断我们不应该去放在界面层。那要放在哪里呢?
放在工厂里。
这就需要我们再构造一个简单工厂类,来负责生产这些运算类的实例:
public class OperationFactory
{
public static Opreation createOperate(string operate)
{
Operation oper=null;
switch(operate)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMult();
break;
case "/":
oper = new OperationDev();
break;
}
return oper;
}
}
接着在界面层中这样调用:
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA=1;
oper.NumberB=2;
double result = oper.GetResult();
这样下来一个简单的工厂模式就完成啦。
看到没有,将原料NumberA和NumberB放入工厂制造的“运算符”机器中,然后就能得到最后的result产品啦。是不是像一个工厂呢?