## 场景需求:
现在要实现任意两个数字的加、减、乘、除运算;
一, 最初的实现
OperationTest test = new OperationTest();
double num1 = 10;
double num2 = 4;
String flag = "+";
test.getResult(num1, num2, flag);
getResult()实现根据不同的运算符号进行任务分发
public void getResult(double num1, double num2, String flag) {
switch (flag) {
case "+":
jia(num1, num2);
break;
case "-":
jian(num1, num2);
break;
case "*":
chen(num1, num2);
break;
case "/":
chu(num1, num2);
break;
default:
System.out.println("运算符号有误");
break;
}
}
具体的运算逻辑代码(一些运算异常情况这里就先不处理了)
public double jia(double a, double b) {
System.out.println(a + b);
return a + b;
}
public double jian(double a, double b) {
System.out.println(a - b);
return a - b;
}
public double chen(double a, double b) {
System.out.println(a * b);
return a * b;
}
public double chu(double a, double b) {
System.out.println(a / b);
return a / b;
}
二, 工厂模式的实现
存在即合理,设计模式也是如此,因为有需要才会出现;现在需求有变动,需要增加求平方的操作;
按照最初的实现思路的话,就是在getResult()方法里加上一个处理平方的标识符,然后新增一个处理平方的具体运算方法;后期再每扩展一次就修改一次,如此一来代码会逐步变的臃肿,而且改动的过程中不排除对原有的代码功能造成影响;
然后就有了将每种运算单独拿出来作为一个类,业务需要拓展的时候只需要新增类就可以了,这样的好处是代码更显条理清晰可读性强,另外分离出来之后与原有代码互不干扰,不会影响到原有代码的功能;
具体的实现逻辑类图:
简单工厂类OperationFactory的唯一职责就是根据不同的运算符来创建对应的运算实例,
运算类(OperationAdd等)的唯一职责就是进行对应计算并返回结果;
对应的代码实现:
1,父类Operation提取运算类的共有属性(1,数字 2,数字需要进行哪种运算)
public abstract class Operation {
protected static double NUM1;
protected static double NUM2;
public abstract double getResult();
}
2,具体的实现类(加减运算)
public class OperationAdd extends Operation {
@Override
public double getResult() {
return NUM1 + NUM2;
}
}
public class OperationSub extends Operation {
@Override
public double getResult() {
return NUM1 - NUM2;
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
return NUM1 * NUM2;
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
return NUM1 / NUM2;
}
}
3, OperationFactory类
根据运算符号( + - * / )来实例化对应的运算类
public class OperationFactory {
public static Operation ctrateOperation(String flag) {
Operation operation = null;
switch (flag) {
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
case "*":
operation = new OperationMul();
break;
case "/":
operation = new OperationDiv();
break;
default:
break;
}
return operation;
}
}
4, 测试类OperationTest
public static void main(String[] args) {
String flag = "+";
Operation operation = OperationFactory.ctrateOperation(flag);
Operation.NUM1 = 10;
Operation.NUM2 = 4;
System.out.println(operation.getResult());
}
通过NUM1, NUM1, flag三个参数来进行对应的运算测试, 求平方的话于此类似, 新增个类处理就可以了;