简单计算器其实就是对于两个运算数的操作。那么,当程序从简单到复杂的过程中,容易出现这样的问题,运算可能有多种情况,当有新的运算要加入时,如何添加新的运算是程序的重点。比如,一个薪资系统,老板,经理,你的工资算法都是在一个类里,当需要添加一个实习生的工资时,如果在原类中进行修改,那么你的工资就喝老板的工资都成透明的了,不便于数据的保护。如何实现可扩展,可维护,可复用,灵活呢,就简单实用一下工厂模式。
1. 面试题:实现两个数的计算器
乍一看,很简单。顺序从头到脚,从输入到输出即可。
public class Calculator{
private String A;
private String B;
A = input();
B = input();
private String C;
C = inputOper();
if(C == '+'){
System.out.println(A+B);
}
if(C == '-'){
System.out.println(A+B);
}
if(C == '*'){
System.out.println(A+B);
}
if(C == '/'){
System.out.println(A+B);
}
程序写完了,如果你是想做计算机方面工作的,那么请你放弃吧,这里不是你的未来。
首先,命名问题,其次是程序的逻辑问题。
2. 使用面向对象思想
面向对象就是为了满足程序的可维护,可扩展,和可复用的要求。一个很好的例子:活字印刷。只需要改字,便可以满足要求;并且,这些字还可以用在其他的文章中,便可以满足复用;如果要加字,只需要另外刻字,便可以满足扩展;
那么,如何让面向对象来满足计算器的方法呢?
准确的说,就是让业务和逻辑进行分离,可以说,这是所有编程的必备思想;
另外,一个优秀的程序员会分析代码的创建过程中,执行的效率问题。比如是否有不必要的编译和执行等。如何避免不必要的实例化问题;
简单工厂模式就是实现实例化的过程:我拥有很多简单的原材料,但是要加工成不同的玩具,还是根据我的工厂模具来定型;
3. 代码实现
程序功能组成:
1. 加法
2. 减法
3. 新增加乘法
实现过程:
1. 创建基础的操作类
// 两个操作数
package a2;
public class Operation {
private double _numberA = 0;
private double _numberB = 0;
protected double get_numberA() {
return _numberA;
}
protected void set_numberA(double _numberA) {
this._numberA = _numberA;
}
public double get_numberB() {
return _numberB;
}
public void set_numberB(double _numberB) {
this._numberB = _numberB;
}
// get the result;
public double getResult(){
double result = 0;
return result;
}
}
因为java中本身的类中成员函数就是虚函数,因此,把getResult()当成虚函数来对待;
2. 创建加法的操作子类
package a2;
public class OperationAdd extends Operation{
// Java中其实没有虚函数的概念,它的普通函数就相当于C++的虚函数,
// 动态绑定是Java的默认行为。
// 如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数
@Override
public double getResult(){
double result = get_numberA() + get_numberB();
return result;
}
}
3 . 创建减法的操作子类
package a2;
public class OperationSub extends Operation{
@Override
public double getResult(){
double result = get_numberA() - get_numberB();
return result;
}
}
4、 创建工厂
传递的参数为字符串,因为来自客户端的参数只能够为字符串的格式;
package a2;
public class OperationFactory {
public static Operation createOperation(String operateString){
Operation oper = null;
// 防止不必要的实例化,使用工厂模式。
switch (operateString) {
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
default:
break;
}
return oper;
}
}
5、 创建客户端代码
package a2;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
System.out.println("Please Type in two values:");
Scanner sc = new Scanner(System.in);
double _numberA = sc.nextDouble();
double _numberB = sc.nextDouble();
System.out.println("Which operation you want to do?");
String operatorString = sc.next();
Operation oper = OperationFactory.createOperation(operatorString);
oper.set_numberA(_numberA);
oper.set_numberB(_numberB);
double _result = oper.getResult();
System.out.println("Result is: " + _result);
}
}
6、 如何想增加一个运算操作应该怎么办呢?
创建一个新的子类:OperationMul
package a2;
public class OperationMul extends Operation{
@Override
public double getResult(){
double result = get_numberA() * get_numberB();
return result;
}
}
在工厂中加入新的操作指令:
case "*":
oper = new OperationMul();
break;
那么就可以直接在客户端进行调用了。
4. 简单分析
继承和创建关系