欢迎移步博主CSDN:CSDN博客
简单工厂和工厂方法模式实现四则计算器
简单工厂模式
- 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
类图如下:
下面将采用简单工厂模式来实现一个计算器类。
实现结构图图:
Operation中的操作类图如下:
下面是各个类的代码实现
Operation接口类:
package Operation;
public interface Operation {
Double getResult(double num1,double num2) throws Exception;
}四则运算类:
//加法
public class Add implements Operation {
@Override
public Double getResult(double num1, double num2) throws Exception {
return num1 + num2;
}
}
//减法
public class Sub implements Operation {
@Override
public Double getResult(double num1, double num2) throws Exception {
return num1 - num2;
}
}
//乘法
public class Mul implements Operation{
@Override
public Double getResult(double num1, double num2) throws Exception {
return num1 * num2;
}
}
//除法
public class Div implements Operation {
@Override
public Double getResult(double num1, double num2) throws Exception {
if(num2 == 0)
throw new Exception("error: 除数不能为零!");
return num1 / num2;
}
}简单工厂类simpleFactory:
import Operation.*;
public class simpleFactory {
//简单工厂模式,根据选择条件创建相应的操作符
public static Operation createOperation(String op){
Operation operation = null;
//根据选择条件创建相应的操作类
switch (op){
case "+": operation = new Add();break;
case "-": operation = new Sub();break;
case "*": operation = new Mul();break;
case "/": operation = new Div();break;
}
return operation;
}
}主函数:
import Operation.Operation;
public class Main {
public static void main(String [] args) throws Exception{
//加法
Operation add = simpleFactory.createOperation("+");
//减法
Operation sub = simpleFactory.createOperation("-");
//乘法
Operation mul = simpleFactory.createOperation("*");
//除法
Operation div = simpleFactory.createOperation("/");
System.out.println("加法:" + add.getResult(1,1));
System.out.println("减法:" + sub.getResult(1,1));
System.out.println("乘法:" + mul.getResult(1,1));
System.out.println("除法:" + div.getResult(3,2));
}
}运行结果:
工厂方法模式
- 定义一个用于创建对象的接口,但是让子类决定将哪个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

结构图如下:
Factory包中的类图:
Product包中的类图
下面是各个类的代码实现
Operation接口类
public interface Operation {
public double getResult(double sum1,double sum2) throws Exception;
}产品(运算操作)类的代码和简单工厂模式相同,在此就不再重复了。
各个工厂类的实现代码:
/**
* 工厂方法
* @author zbl
*
* @email 1399853961@qq.com
*/
public interface Factory {
public Operation creatFactory();
}
public class AddFactory implements Factory{
@Override
public Operation creatFactory() {
//加法运算工厂
return new Add();
}
}
public class SubFactory implements Factory {
@Override
public Operation creatFactory() {
//减法运算工厂
return new Sub();
}
}
public class MulFactory implements Factory {
@Override
public Operation creatFactory() {
return new Mul();
}
}
public class DivFactory implements Factory {
@Override
public Operation creatFactory() {
return new Div();
}
}主函数:
public class Main {
public static void main(String[] args) throws Exception {
//读取配置文件
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(new File("src/config.xml"));
Node node = document.getElementsByTagName("OperatorFactory").item(0).getFirstChild();
//加法工厂
Factory addFactory = (Factory) Class.forName(node.getNodeValue().trim()).newInstance();
double result = addFactory.creatFactory().getResult(1, 2);
System.out.println("结果:" + result);
}
}config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
<OperatorFactory>Factory.AddFactory</OperatorFactory>
</config>运行结果:
参考文献
刘伟,胡志刚. C#设计模式(第2版)[M]. 清华大学出版社.