Java是面向对象的语言,所以在代码中会出现许多的创建对象的现象。首先来看下,一个简单的计算器功能,来引出简单工厂模式(也叫静态工厂模式)的好处。
简单工厂模式:方便创建对象而不需要知道创建对象的过程。
常见代码:
代码基类:
package com.zwz.calculator;
public abstract class Operation {
private int num1;
private int num2;
//计算方法
public abstract int getResult();
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
}
加法类:
package com.zwz.calculator;
public class OperationAdd extends Operation {
@Override
public int getResult() {
return getNum1() + getNum2();
}
}
减法类:
package com.zwz.calculator;
public class OperationSubtr extends Operation {
@Override
public int getResult() {
return getNum1() - getNum2();
}
}
客户端测试类:
package com.zwz.calculator;
import java.util.Scanner;
public class OperationTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int result=0;
System.out.println("请输入第一个数字!");
int num1=scanner.nextInt();
System.out.println("请输入运算符!");
String oper=scanner.next();
System.out.println("请输入第二个数字!");
int num2=scanner.nextInt();
if("+".equals(oper)){
OperationAdd operation = new OperationAdd();
operation.setNum1(num1);
operation.setNum2(num2);
result = operation.getResult();
}else if("-".equals(oper)){
OperationSubtr operation = new OperationSubtr();
operation.setNum1(num1);
operation.setNum2(num2);
result = operation.getResult();
}else{
System.out.println("运算类型不符合");
}
System.out.println("结果是:"+result);
}
}
解决方案:从客户端测试代码来看,不同的运算符需要实例不同的类,这样会导致客户端需要很多的判断。如何避免这样的现象,我们可以把判断运算符实例化对象的这个代码写到工厂中,就可以了。
简单工厂类:
package com.zwz.calculator;
/**
* 简单工厂类
* @author zwz
* @Date 2016-11-02 16:11:41
*
*/
public class OperationFactory {
public static Operation creationOperation(String operation){
Operation oper=null;
switch (operation) {
case "+":
oper=new OperationAdd();
break;
case "-":
oper=new OperationSubtr();
break;
default:
break;
}
return oper;
}
}
改造后的客户端测试代码:
package com.zwz.calculator;
import java.util.Scanner;
public class OperationTest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int result=0;
System.out.println("请输入第一个数字!");
int num1=scanner.nextInt();
System.out.println("请输入运算符!");
String oper=scanner.next();
System.out.println("请输入第二个数字!");
int num2=scanner.nextInt();
Operation operation = OperationFactory.creationOperation(oper);
operation.setNum1(num1);
operation.setNum2(num2);
result = operation.getResult();
System.out.println("结果是:"+result);
}
}