设计模式之简单工厂模式

定义一个加减乘除计算机来简单梳理简单工厂模式

常规方式实现

定义函数

private static void func1(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数字A:");
        String strA = scanner.nextLine();
        System.out.println("请输入运算符(+、-、*、/):");
        String strOper = scanner.nextLine();
        System.out.println("请输入数字B:");
        String strB = scanner.nextLine();

        String strResult = "";
        try{
            switch (strOper){
                case "+":
                    strResult = Integer.valueOf(strA)+Integer.valueOf(strB)+"";
                    break;
                case "-":
                    strResult = Integer.valueOf(strA)-Integer.valueOf(strB)+"";
                    break;
                case "*":
                    strResult = Integer.valueOf(strA)*Integer.valueOf(strB)+"";
                    break;
                case "/":
                    if("0".equals(strB)){
                        strResult = "除数不能为0!";
                    }else{
                        strResult = Integer.valueOf(strA)/Integer.valueOf(strB)+"";
                    }
                    break;
            }
            System.out.println("运算结果是:"+strResult);
        }catch (Exception e){
            System.out.println("运算出错,异常信息:"+e.getMessage());
        }

    }

执行结果

请输入数字A:
10
请输入运算符(+、-、*、/):
+
请输入数字B:
15
运算结果是:25.0

分析

常规方法,写法固定简单,但硬代码实现,无法方便扩展,比如增加一个平方运算法则,就要完全重写逻辑。

简单工厂模式实现

实现源码

定义运算基类Operation

public class Operation {
    private double numA = 0;
    private double numB = 0;

    public double getNumA() {
        return numA;
    }

    public void setNumA(double numA) {
        this.numA = numA;
    }

    public double getNumB() {
        return numB;
    }

    public void setNumB(double numB) {
        this.numB = numB;
    }

    public double getResult() throws Exception {
        double result = 0;
        return result;
    }
}

定义运算基类Operation的派生类(加减乘除)

public class OperationAdd extends Operation{
    @Override
    public double getResult() {
        double result = 0;
        result = getNumA()+getNumB();
        return result;
    }
}
public class OperationSub extends Operation{
    @Override
    public double getResult() {
        double result = 0;
        result = getNumA()-getNumB();
        return result;
    }
}
public class OperationMul extends Operation{
    @Override
    public double getResult() {
        double result = 0;
        result = getNumA()*getNumB();
        return result;
    }
}
public class OperationDiv extends Operation{
    @Override
    public double getResult() throws Exception {
        double result = 0;
        if(getNumB() == 0){
            throw new Exception("除数不能为0");
        }
        result = getNumA()/getNumB();
        return result;
    }
}

定义工厂类,用于根据运算符生成对应的运算类

public class OperationFactory {
    public static Operation createOperate(String operate){
        Operation operation = null;
        switch (operate){
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
        }
        return operation;
    }
}

业务方法中,通过工厂类和运算符,来生成对应的运算符类计算得到最终结果

public static void func2(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数字A:");
        String strA = scanner.nextLine();
        System.out.println("请输入运算符(+、-、*、/):");
        String strOper = scanner.nextLine();
        System.out.println("请输入数字B:");
        String strB = scanner.nextLine();

        String strResult = "";
        try{
            Operation operation = OperationFactory.createOperate(strOper);
            operation.setNumA(Double.valueOf(strA));
            operation.setNumB(Double.valueOf(strB));
            strResult = operation.getResult()+"";
            System.out.println("运算结果是:"+strResult);
        }catch (Exception e){
            System.out.println("运算出错,异常信息:"+e.getMessage());
        }

    }

执行结果

请输入数字A:
10
请输入运算符(+、-、*、/):
+
请输入数字B:
15
运算结果是:25.0

分析

通过运算符让工厂类来自动识别生成对应的计算方法,方便扩展。
比如增加一个平方运算法则,只需要增加一个对应的开平方方法类,增加相应的运算符识别逻辑就行了,不影响原来的加减乘除的核心运算逻辑。

联系作者

微信公众号

xiaomingxiaola

QQ群

58726094


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com

×

喜欢就点赞,疼爱就打赏

日记本 网文世界