一、工厂模式在开发中的运用
面试题:写一个简单的计算器
代码实现:
(1)、创建MainClass
package com.renxin.factory;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
//第一步:接受控制台输入的参数
System.out.println("-----计算器程序-----");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数:");
String strNum1 = scanner.nextLine();
System.out.println("请输入运算符:");
String oper = scanner.nextLine();
System.out.println("请输入第二个数:");
String strNum2 = scanner.nextLine();
//第二步:进行运算
double result = 0;
if("+".equals(oper)) {
result = Double.parseDouble(strNum1) + Double.parseDouble(strNum2);
}else if("-".equals(oper)) {
result = Double.parseDouble(strNum1) - Double.parseDouble(strNum2);
}else if("*".equals(oper)) {
result = Double.parseDouble(strNum1) * Double.parseDouble(strNum2);
}else if("/".equals(oper)) {
result = Double.parseDouble(strNum1) / Double.parseDouble(strNum2);
}
//返回结果
System.out.println(strNum1+oper+strNum2+"="+result);
}
}
控制台输出结果为:
请输入第一个数:
10
请输入运算符:
/
请输入第二个数:
2
10/2=5.0
上面代码存在缺点:完全面向过程设计,缺少代码复用
改进以上代码:
(1)、创建抽象类Operation
package com.renxin.factory;
public abstract class Operation {
private double num1;
private double num2;
public double getNum1() {
return num1;
}
public void setNum1(double num1) {
this.num1 = num1;
}
public double getNum2() {
return num2;
}
public void setNum2(double num2) {
this.num2 = num2;
}
// 抽象方法
public abstract double getResult();
}
(2)、创建AddOperation并且继承Operation
package com.renxin.factory;
public class AddOperation extends Operation {
public double getResult() {
double result = this.getNum1()+this.getNum2();
return result;
}
}
(3)、修改MainClass
package com.renxin.factory;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
//第一步:接受控制台输入的参数
System.out.println("-----计算器程序-----");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数:");
String strNum1 = scanner.nextLine();
System.out.println("请输入运算符:");
String oper = scanner.nextLine();
System.out.println("请输入第二个数:");
String strNum2 = scanner.nextLine();
//第二步:进行运算
double result = 0;
double num1 = Double.parseDouble(strNum1);
double num2 = Double.parseDouble(strNum2);
Operation operation = new AddOperation();
operation.setNum1(num1);
operation.setNum2(num2);
if("+".equals(oper)) {
result = operation.getResult();
}else if("-".equals(oper)) {
result = operation.getResult();
}else if("*".equals(oper)) {
result = operation.getResult();
}else if("/".equals(oper)) {
result = operation.getResult();
}
//返回结果
System.out.println(strNum1+oper+strNum2+"="+result);
}
}
控制台输出结果为:
-----计算器程序-----
请输入第一个数:
1
请输入运算符:
+
请输入第二个数:
1
1+1=2.0
改进后的代码就是一个简单工厂模式的实现,但是还不是很完善,如果我们不想new这个Operation operation = new AddOperation();的话我们还可以改进,将它交给工厂来处理!
(1)、创建OperationFactory工厂
package com.renxin.factory;
public class OperationFactory {
public static Operation getOperation(String oper) {
if("+".equals(oper)) {
return new AddOperation();
}else if("-".equals(oper)) {
return new subOperation();
}else if("*".equals(oper)) {
return new mulOperation();
}else if("/".equals(oper)) {
return new divOperation();
}
return null;
}
}
(2)、创建加法AddOperation类,并且继承Operation
package com.renxin.factory;
public class AddOperation extends Operation {
public double getResult() {
double result = this.getNum1()+this.getNum2();
return result;
}
}
(3)、修改MainClass
package com.renxin.factory;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
//第一步:接受控制台输入的参数
System.out.println("-----计算器程序-----");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数:");
String strNum1 = scanner.nextLine();
System.out.println("请输入运算符:");
String oper = scanner.nextLine();
System.out.println("请输入第二个数:");
String strNum2 = scanner.nextLine();
//第二步:进行运算
double result = 0;
double num1 = Double.parseDouble(strNum1);
double num2 = Double.parseDouble(strNum2);
Operation operation = OperationFactory.getOperation(oper);
operation.setNum1(num1);
operation.setNum2(num2);
result = operation.getResult();
//返回结果
System.out.println(strNum1+oper+strNum2+"="+result);
}
}
控制台打印结果为:
请输入第一个数:
1
请输入运算符:
+
请输入第二个数:
3
1+3=4.0
以上修改后的代码就是工厂方法模式的一个实现!
到这里为止以上代码只符合了开放封闭原则的开放原则,因此以上代码还可以进行改进!
(1)、修改OperationFactory类
package com.renxin.factory;
public interface OperationFactory {
/*public static Operation getOperation(String oper) {
if("+".equals(oper)) {
return new AddOperation();
}else if("-".equals(oper)) {
return new subOperation();
}else if("*".equals(oper)) {
return new mulOperation();
}else if("/".equals(oper)) {
return new divOperation();
}
return null;
}*/
public Operation getOperation();
}
(2)、创建实现类AddOperationFactory
package com.renxin.factory;
public class AddOperationFactory implements OperationFactory {
public Operation getOperation() {
return new AddOperation();
}
}
(3)、修改MainClass
package com.renxin.factory;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
//第一步:接受控制台输入的参数
System.out.println("-----计算器程序-----");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数:");
String strNum1 = scanner.nextLine();
System.out.println("请输入运算符:");
String oper = scanner.nextLine();
System.out.println("请输入第二个数:");
String strNum2 = scanner.nextLine();
//第二步:进行运算
double result = 0;
double num1 = Double.parseDouble(strNum1);
double num2 = Double.parseDouble(strNum2);
/*Operation operation = OperationFactory.getOperation(oper);
operation.setNum1(num1);
operation.setNum2(num2);
result = operation.getResult();*/
if("+".equals(oper)) {
OperationFactory factory = new AddOperationFactory();
Operation operation = factory.getOperation();
operation.setNum1(num1);
operation.setNum2(num2);
result = operation.getResult();
}
//返回结果
System.out.println(strNum1+oper+strNum2+"="+result);
}
}
控制台输出结果为:
请输入第一个数:
1
请输入运算符:
+
请输入第二个数:
1
1+1=2.0
以上修改后的代码就是抽象工厂模式的一个实现!
这样写的好处就是我们要新增其他运算的时候我们不需要修改工厂了,我们只需要添加一个相应的运算类和相应的工厂,这样也有一个缺点MainClass在调用的时候,你必须知道调用的那个工厂,所有在客户端里面就有做相应的判断!