工作了将近两年,感觉自己很辣鸡,于是买了几本书,学习一下,提高一下自己. 看了大话设计模式这本书,把学到的记录一下。
需求 :实现一个简单的计算器功能。
一般的情况下:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数A");
Double numberA = scanner.nextDouble();
System.out.println("请输入一个数B");
Double numberB = scanner.nextDouble();
System.out.println("请选择一种运算方式:加(+)、减(-)、乘(*)、除(/)");
String operation = scanner.next();
double rst = 0;
if (operation.equals("+")) {
rst = numberA + numberB;
}
if (operation.equals("-")) {
rst = numberA - numberB;
}
if (operation.equals("*")) {
rst = numberA * numberB;
}
if (operation.equals("/")) {
rst = numberA / numberB;
}
System.out.println("结果为:" + rst);
}
但是这种代码真的很辣鸡,只是简单的实现了需求,如果需要改变条件或者增减条件,都需要重构代码 ,很显然不易于维护。
看下面的代码 :
首先创建一个运算类
public class Operation {
private double _numberA=0;
private double _numberB=0;
public double get_numberA() {
return _numberA;
}
public void set_numberA(double _numberA) {
this._numberA = _numberA;
}
public double get_numberB() {
return _numberB;
}
public void set_numberB(double _numberB) {
this._numberB = _numberB;
}
public double GetResult(){
double result =0 ;
return result;
}
}
在创建 加减乘除类 :
加
public class OperationAdd extends Operation {
public double GetResult(){
double result =0 ;
result=super.get_numberA()+super.get_numberB();
return result;
}
}
减
public class OperationSub extends Operation {
public double GetResult(){
double result =0 ;
result=super.get_numberA()-super.get_numberB();
return result;
}
}
乘
public class OperationMul extends Operation {
public double GetResult(){
double result =0 ;
result=super.get_numberA()*super.get_numberB();
return result;
}
}
除
public class OperationDiv extends Operation {
public double GetResult(){
double result =0 ;
result=super.get_numberA()/super.get_numberB();
return result;
}
}
在创建一个工厂类
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;
}
}
最后在编写客户端代码:
public class Main {
public static void main(String[] args) {
Operation oper ;
oper=OperationFactory.createOperate("+");
oper.set_numberA(1);
oper.set_numberB(2);
double result =oper.GetResult();
System.out.println(result);
}
}
相对于第一种方法来说,也许繁琐了一些,编写了好多个类,但是正因为这么多的类,才把各个功能都分开,并且能够快速的进行二次,三次运算。
这就是简单工厂模式,有一个模式工厂,还有一个样本,通过调用这个工厂,来实现自己的需求。优点在于模块清晰化,每个部分都各司其职,分工明确 。简单的实现了可维
护。但是如果再加入一个开平方的需求,那么就得增加一个开平方的类,在工厂里面添加 case 耦合性还是较高。