欢迎移步博主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]. 清华大学出版社.

最后修改:2020 年 03 月 14 日 12 : 39 PM
如果觉得我的文章对你有用,请随意赞赏