有这样一个问题,以面向对象的方法去实现一个简单的计算器该怎么实现呢?
首先,有种很简单的思路,输入两个数,然后判断运算符类型,进行相应运算,最后输出结果。
这样的方法虽然也能完成,但是不符合面向对象的方法,并且如果有一种新加的运算符时,会显得十分
的冗余而不好更改。
那有没有一种更好的方法呢?
这就是简单工厂模式,理解就是女娲造人造啥做啥,工作类有相似的操作功能,并且当新加如
功能类时,不影响以及不需要修改其他的功能类。
先给出类图:
Operation类是一个抽象类,除了有两个成员变量外,还有个需要子类实现的抽象方法getResult();
统一的通过OperationFactory类去获得实例Operation的子类,根据特定的传入命令,要啥获得啥;
这样一来,如果要新加入一种计算功能,从类图上看,只需要添加一个类继承Operation,
并且在OperationFactory中加入相应实例化语句就行,而不需要动其他的类。
下面看详细的代码:
Operation类:
package com.blog.anla.SimpleFactory;
public abstract class Operation {
protected double numberA;
protected double numberB;
/**
* 得到运算结果
* @return
*/
public abstract double getResult();
}
OperationAdd类:
package com.blog.anla.SimpleFactory;
public class OperationAdd extends Operation{
@Override
public double getResult() {
return numberA + numberB;
}
}
package com.blog.anla.SimpleFactory;
public class OperationSub extends Operation{
@Override
public double getResult() {
return numberA - numberB;
}
}
OperationMul类:
package com.blog.anla.SimpleFactory;
public class OperationMul extends Operation{
@Override
public double getResult() {
return numberA*numberB;
}
}
OperationDiv类:
package com.blog.anla.SimpleFactory;
public class OperationDiv extends Operation{
@Override
public double getResult() {
if(numberB != 0){
return numberA / numberB;
}else{
return 0;
}
}
}
OperationFactory类:
package com.blog.anla.SimpleFactory;
/**
* 简单工厂,需要啥类就考虑用一个
* 单独的类来创造示例工程。
* 降低了功能类之间的耦合性,如果要添加一个新功能,
* 仅仅需要加相应的类,而不需要更改其他的类
* @author U-ANLA
*
*/
public class OperationFactory {
public static Operation createOperate(char 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;
}
public static void main(String[] args) {
Operation oper = OperationFactory.createOperate('+');
oper.numberA = 1;
oper.numberB = 2;
System.out.println(oper.getResult());
}
}
赠人玫瑰手留余香,希望对大家有用哈
~( ̄▽ ̄~)~