Loading... 欢迎移步博主CSDN:[CSDN博客](https://blog.csdn.net/weixin_42327790/article/details/102826630) # 简单工厂和工厂方法模式实现四则计算器 ## 简单工厂模式 * 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。 类图如下: ![image1.png](https://www.520315.xyz/usr/uploads/2023/03/818423229.png) --- 下面将采用简单工厂模式来实现一个计算器类。 实现结构图图: ![image2.png](https://www.520315.xyz/usr/uploads/2023/03/4021907737.png) Operation中的操作类图如下: ![image3.png](https://www.520315.xyz/usr/uploads/2023/03/2764906190.png) **下面是各个类的代码实现** Operation接口类: ----------------- ```java package Operation; public interface Operation { Double getResult(double num1,double num2) throws Exception; } ``` 四则运算类: ```java //加法 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: ```java 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; } } ``` 主函数: ```java 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)); } } ``` 运行结果: ![image3.png](https://www.520315.xyz/usr/uploads/2023/03/2147627180.png) ## 工厂方法模式 * 定义一个用于创建对象的接口,但是让子类决定将哪个类实例化。工厂方法模式让一个类的实例化延迟到其子类。 ![image4.png](https://www.520315.xyz/usr/uploads/2023/03/2089477230.png) 结构图如下: ![image5.png](https://www.520315.xyz/usr/uploads/2023/03/4020868930.png) Factory包中的类图: ![image6.png](https://www.520315.xyz/usr/uploads/2023/03/214275207.png) Product包中的类图 ![image7.png](https://www.520315.xyz/usr/uploads/2023/03/532743630.png) **下面是各个类的代码实现** Operation接口类 ```java public interface Operation { public double getResult(double sum1,double sum2) throws Exception; } ``` 产品(运算操作)类的代码和简单工厂模式相同,在此就不再重复了。 各个工厂类的实现代码: ```java /** * 工厂方法 * @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(); } } ``` 主函数: ```java 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 <?xml version="1.0" encoding="UTF-8"?> <config> <OperatorFactory>Factory.AddFactory</OperatorFactory> </config> ``` 运行结果: ![image7.png](https://www.520315.xyz/usr/uploads/2023/03/3753570026.png) ## 参考文献 刘伟,胡志刚. C#设计模式(第2版)[M]. 清华大学出版社. 最后修改:2023 年 03 月 19 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏