这几天看到关于设计模式的一些问题,关于模式的书籍,市面上有很多,看完之后自己总算有一点点有体会。下面我以计算机的实例来讲解一下简单工厂模式.
现在我们试着写一个Windows的计算器.也许有些人认为很简单,很快就能写出下面类似的代码:
try{
System.out.println("请输入数字A:");
int strNumberA=input.nextInt();
System.out.println("请选择运算符号(+,-,*,/:)");
String strOperate=input.next();
System.out.println("请输入数字B:");
int strNumberB=input.nextInt();
String strResult="";
switch(strOperate.charAt(0)){
case '+':
strResult=strNumberA+strNumberB+"";
break;
case '-':
strResult=strNumberA-strNumberB+"";
break;
case '*':
strResult=strNumberA*strNumberB+"";
break;
case '/':
if(strNumberB!=0){
strResult=strNumberA/strNumberB+"";
}else
strResult="除数不能为0";
break;
}
System.out.println("结果为"+strResult);
}catch(Exception ex){
System.out.println(ex.getMessage());
}
虽然代码没有错,但是不是最好的。这种编程方式让我们的程序只为满足实现当前的需求,程序不容易维护,不容易扩展,更不容易复用,从而达不到高质量代码的需求。我们可以运用面向对象的分析设计编程思想,通过封装,继承,多态把程序的耦合度降低。用设计模式使得程序更加的灵活,容易修改,并且易用复用。
第一种方式:我们要让业务逻辑与界面逻辑分开,让他们之间的耦合度下降。那我们可以抽象出类, 再运用继承和多态。
第二种方式:在第易种方式的基础上,运用简单工厂模式。
说到简单工厂模式,我们来谈谈它的作用:用创建一个单独的类来做这个创造实例的过程。
我们知道,计算器界面无非就是接受数和运算符号。如果我们的计算当前已经完成了4种运算,如果现在需要增加一种运算呢,那我们只需要增加一个运算子类就可以了。
我们把代码修改一下:
运算类:
public class Operation {
private double _numberA=0;
private double _numberB=0;
public double get_numberA() {
return _numberA;
}
public void set_numberA(double numberA) {
_numberA = numberA;
}
public double get_numberB() {
return _numberB;
}
public void set_numberB(double numberB) {
_numberB = numberB;
}
public double GetResult(){
double result=0;
return result;
}
}
加法类:
public class OperationAdd extends Operation{
public double GetResult(){
double result=0;
result=get_numberA()+get_numberB();
return result;
}
}
其他的运算类类似,
运算工厂类:
public class OperationFactory {
public static Operation createOperation(String operation){
Operation oper=null;
switch(operation.charAt(0)){
case '+':
oper=new OperationAdd();
break;
case '-':
oper=new OperationSub();
break;
case '*':
oper=new OperationMul();
break;
case '/':
oper=new OperationDiv();
break;
}
return oper;
}
}
运算工厂类返回的都是运算类,具体是那种运算类,这将由用户输入的运算符来决定,如果我们需要其他的运算,我们只需要添加类似加法类的运算类,再在工厂里加一个switch分支就OK了,无需更加其他的代码。
测试类的代码如下:
System.out.println("请输入要进行的运算符:");
Scanner input=new Scanner(System.in);
String operation=input.next();
Operation oper=OperationFactory.createOperation(operation);
System.out.println("请输入第一个数:");
double numberA=input.nextDouble();
oper.set_numberA(numberA);
System.out.println("请输入第二个数:");
double numberB=input.nextDouble();
oper.set_numberB(numberB);
double result=oper.GetResult();
System.out.println("结果是:"+result);
这样我们写出来的代码可扩展性就好很多。我们很多时候写代码,不是越小越好。还应该更多得考虑它的扩展性。让我们的代码更容易维护。
编程是一门技术,更是一门艺术,能写出优雅的代码更是一件很爽的事情。