编程不仅是一门技术,还是一门艺术。简单,精炼,优雅是我们的追求。在现实编程环境中,需求永远不是固定的,这就需要我们在做设计研发的时候,必须考虑到程序的可拓展性和后期可维护性。简单凝练的代码提高后期维护的简易性,良好的设计可以提高代码的拓展性,设计模式能够实现这些功能。
现在我们以计算器模型来简单讨论一下简单工厂的设计模式
记得还是刚入门的时候,写过这样的代码
public class Operation {
public static double getResult(double firstNumber,double secondNumber,String operator){
double result =0l;
switch(operator){
case "+": result = firstNumber+secondNumber;break;
case "-": result = firstNumber-secondNumber;break;
case "*": result = firstNumber*secondNumber;break;
case "/": result = firstNumber/secondNumber;break;
}
return result;
}
}
分析:
这样的代码也可以实现功能(有一些bug,暂时不讨论,比如double的上限,除法的规则等)。但是,如果要增加一个平方运算(拓展性),或者修改除法的bug(维护性)等,都需要对这个Operation做修改,这个只是很简单的业务逻辑,试想一下,如果每个case分支有成千上百行的业务逻辑,修改起来相当棘手了。
因此需要一种方式来重构代码。
public class Operation {
private double firstNumber;
private double secondNumber;
public double getResult(){
return 0l;
}
public double getFirstNumber() {
return firstNumber;
}
public void setFirstNumber(double firstNumber) {
this.firstNumber = firstNumber;
}
public double getSecondNumber() {
return secondNumber;
}
public void setSecondNumber(double secondNumber) {
this.secondNumber = secondNumber;
}
}
加法类
public class Add extends Operation {
public Add(double firstNumber,double secondNumber){
this.setFirstNumber(firstNumber);
this.setSecondNumber(secondNumber);
}
public double getResult(){
return this.getFirstNumber()+this.getSecondNumber();
}
}
减法类
public class Sub extends Operation {
public Sub(double firstNumber,double secondNumber){
this.setFirstNumber(firstNumber);
this.setSecondNumber(secondNumber);
}
public double getResult(){
return this.getFirstNumber()-this.getSecondNumber();
}
}
乘法类
public class Mul extends Operation {
public Mul(double firstNumber,double secondNumber){
this.setFirstNumber(firstNumber);
this.setSecondNumber(secondNumber);
}
public double getResult(){
return this.getFirstNumber()*this.getSecondNumber();
}
}
除法类
public class Div extends Operation {
public Div(double firstNumber,double secondNumber){
this.setFirstNumber(firstNumber);
this.setSecondNumber(secondNumber);
}
public double getResult(){
return this.getFirstNumber()/this.getSecondNumber();
}
}
...
工厂类
public class OperatorFactory {
public static Operation createOperate(String operate,double firstNumber,double secondNumber){
Operation oper=null;
switch(operate){
case "+": oper = new Add(firstNumber,secondNumber);break;
case "-": oper = new Sub(firstNumber,secondNumber);break;
case "*": oper = new Mul(firstNumber,secondNumber);break;
case "/": oper = new Div(firstNumber,secondNumber);break;
}
return oper;
}
}
调用方式
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Operation oper = OperatorFactory.createOperate("+",30,20);
System.out.println(oper.getResult());
}
}
分析:
这样重构之后,如果再添加其他的运算方法,只是需要新增一些Operation的子类就可以了,详细的算法可以新增到子类中,这样就不需要改造原有的运算方法了。相对维护代码来说,也简便了许多。在实际框架设计中,简单工厂模式和普遍,比如,jdbc中,不同数据库的数据源连接(mysql,oracle,sqlserver等等),都可以采用简单工厂模式来提高程序的简易性。