Java简单工厂模式

参考书目 《大话设计模式》 程杰 清华大学出版社

代码链接 https://github.com/JiaZhengJingXianSheng/Calculator_By_Java

我们在编写程序时为了容易修改,通常会用 封装、继承、多态 来降低程序的耦合度。

比如我们要实现一个简单的计算器功能,具体功能为传入两个数值和一个操作符,返回计算结果。


一、 抽象类创建

通常我们会在一个抽象类内部定义主要的信息,比如输出输出等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public abstract class Operation {
private double _numberA = 0;
private double _numberB = 0;

public double get_numberA() {
return _numberA;
}

public void set_numberA(double _numberA) {
this._numberA = _numberA;
}

public double get_numberB() {
return _numberB;
}

public void set_numberB(double _numberB) {
this._numberB = _numberB;
}

public abstract double getResult() throws Exception;

}

我们定义一个抽象计算函数,方便我们在不同操作下覆写这个操作。


二、 定义运算

接下来我们分别定义各种运算,继承Operation的信息,并覆写计算函数 \(getResult()\)

1
2
3
4
5
6
public class OperationAdd extends Operation {
@Override
public double getResult() {
return get_numberA() + get_numberB();
}
}
1
2
3
4
5
6
public class OperationSub extends Operation {
@Override
public double getResult() {
return get_numberA() - get_numberB();
}
}
1
2
3
4
5
6
public class OperationMul extends Operation{
@Override
public double getResult() {
return get_numberA() * get_numberB();
}
}
1
2
3
4
5
6
7
8
9
public class OperationDiv extends Operation{
@Override
public double getResult() throws Exception {
if(get_numberB() == 0) {
throw new Exception("除数不能为0 ");
}
return get_numberA() / get_numberB();
}
}

我们在除法过程中判断被除数是否为0,为零抛出异常。


三、 工厂定义

接下来定义一个简单的工厂,传入我们的运算符,进行判断,并返回第二步所定义的操作类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SimpleFactory {
public static Operation createOperation(String operate) {
Operation oper = null;
switch (operate) {
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}

四、 计算函数

定义计算函数,传入操作数以及操作符,在函数内部用第三步的工厂生成操作类,并设置 _ $ numberA$ 和 _ \(numberB\) ,最终调用计算函数并返回,即可实现所有功能。

1
2
3
4
5
6
7
8
9
10
11
12
public static double calculate(double numberA , double numberB, String operate){
Operation oper;
oper = SimpleFactory.createOperation(operate);
oper.set_numberA(numberA);
oper.set_numberB(numberB);
try {
return oper.getResult();
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}

五、 测试

在主函数中调用 \(calculate()\) 函数并打印

1
2
3
4
5
public static void main(String[] args) {
System.out.println(calculate(1,2,"+"));
System.out.println(calculate(1,2,"/"));
System.out.println(calculate(1,0,"/"));
}
1
2
3
4
5
6
7
8
// 运行结果
3.0
0.5
0.0
java.lang.Exception: 除数不能为0
at OperationDiv.getResult(OperationDiv.java:9)
at Calculator.calculate(Calculator.java:12)
at Calculator.main(Calculator.java:22)

总结

用工厂模式我们可以降低维护成本,比如我们想增加一种运算,只需要用新运算去继承我们初始的抽象类,覆写计算函数,并在工厂中加入我们的操作即可,这大大降低了我们代码的耦合度。