简单工厂模式概述
当我们需要根据不同的逻辑创建不同的运算逻辑,而这些逻辑又是同属一个种类下的,此时就可以将判断逻辑放入一个类中,由该类提供入口参数,调用不同的逻辑对象返回相对应的结果。
以下我们就以一个简单的计算器作为例子
不使用工厂模式的实现方法
public class TestMain {
public static void main(String[] args) {
String operator;
int firNum = 1;
int secNum = 2;
//加法
operator = "+";
if("+".equals(operator)) {
System.out.println(firNum + secNum);
} else if("-".equals(operator)) {
System.out.println(firNum - secNum);
} else if("*".equals(operator)) {
System.out.println(firNum * secNum);
} else if("/".equals(operator)) {
if(secNum != 0)
System.out.println(firNum / secNum);
} else {
System.out.println(0);
}
}
}
将每个实现逻辑都写在一个类中,使得该类的职责过于繁重,而这就导致需要修改的时候,可能因为一个小错误就会导致当前类的失效或不可用,所以我们将每个运算逻辑单独取出作为一个类,并将客户端的逻辑提取到一个单独类中进行管理。
定义每个运算逻辑(一个运算逻辑是一个类)
//运算方法接口
interface Operator {
public int getResult(int number1, int number2);
}
//各个运算方法类
//加法
public class Addition implements Operator{
public int getResult(int number1, int number2) {
return number1 + number2;
}
}
//减法
public class Subtraction implements Operator{
public int getResult(int number1, int number2) {
return number1 - number2;
}
}
//乘法
public class Multiplication implements Operator {
public int getResult(int number1, int number2) {
return number1 * number2;
}
}
//除法
public class Divition implements Operator {
public int getResult(int number1, int number2) {
return number1 / number2;
}
}
//两个变量求平均数
public class AverageTwo implements Operator {
public int getResult(int number1, int number2) {
return (number1 + number2) / 2;
}
}
使用简单工厂模式的实现方法
//负责操作的工厂类
public class OperatorFactory {
private String sign;
private int number1;
private int number2;
private Operator operator = null;
public void calculateParam(int number1, int number2, String sign) {
this.number1 = number1;
this.number2 = number2;
this.sign = sign;
}
public int getResult() {
if("+".equals(sign)) {
//加法运算
operator = new Addition();
} else if("-".equals(sign)) {
//减法运算
operator = new Subtraction();
} else if("*".equals(sign)) {
//乘法运算
operator = new Multiplication();
} else if("/".equals(sign)) {
//除法运算
operator = new Divition();
} else if("average".equals(sign)){
operator = new AverageTwo();
} else {
return 0;
}
return operator.getResult(number1, number2);
}
}
//测试函数
public class TestMain {
public static void main(String[] args) {
//此时客户端就只需要传入参与运算的值及操作方法即可
OperatorFactory operatorFactory = new OperatorFactory();
operatorFactory.calculateParam(5, 2, "average");
System.out.println(operatorFactory.getResult());
}
}
总结
使用了简单工厂模式之后,在业务较为简单的情况下,当我们需要增加一个新的运算逻辑时,只需要再新增一个类,且在工厂类中增加对应的判断入口即可。
但是简单工厂模式违背了开闭原则,在我们新增运算逻辑时,仍需修改原类。这个问题在我们下次的工厂方法模式和抽象工厂模式中会有所优化。
才疏学浅,如文中有错误,感谢大家指出。