代码编织梦想

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

常规方式实现

定义函数

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

分析

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

联系

个人主页

https://xmlrambo.github.io/

公众号

xiaomingxiaola

QQ群

58726094

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ForeverLucky_/article/details/128018637

设计模式之简单工厂模式、工厂模式和抽象工厂模式-爱代码爱编程

简单工厂模式、工厂模式和抽象工厂模式 1. 简单工厂模式 简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式定义了一个创建对象的类,由这个类来封装实例化对象的行为。它是由一个工厂对象决定创建出哪一种产品类的实例。 简单工厂模式是工厂模式中最简单使用的模式。 简单工厂模式的三个角色 Factory(工厂角色) :简单工厂模式的核心,它负责

简单工厂模式-爱代码爱编程

        简单工厂模式定义为:简单工厂模式又称为静态工厂方法模型,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。         简单工厂模式结构图:                  简单工厂模式包含如下角色:         

metabase学习教程:视图-4_metabasecn的博客-爱代码爱编程

将数据可视化为直方图 学习何时使用直方图,以及元数据库如何使创建直方图更容易。 我们将逐步创建直方图,它是一种条形图,显示连续范围内的数据组。柱状图有助于深入了解人们可能购买的商品的数量、他们可能购买的价格范围,甚至是大多数人购买商品的时间。 直方图与条形图 直方图是条形图。虽然典型条形图上的条形图表示类别组,但柱状图上的条形图表示沿连续可量化频谱

2022大厂面试秘籍java岗:中间件+算法+http+线程+虚拟机+分布式_啊码的博客-爱代码爱编程

前言 很多朋友对面试不够了解,不知道如何准备,对面试环节的设置以及目的不够了解,因此成功率不高。通常情况下校招生面试的成功率低于1%,而社招的面试成功率也低于5%,所以对于候选人一定要知道设立面试的初衷以及每个环节的意义,

小学生python游戏编程arcade-爱代码爱编程

小学生python游戏编程arcade----碰撞精灵消失问题 前言碰撞精灵消失问题1、多余的精灵不能及时消失1.1 问题1.2 失败代码1.3 记录备忘1.4 代码实现 2、放置位置2.1 代码放在

itext7高级教程之html2pdf——5.自定义标签和css应用_xmlworker 和 html2pdf-爱代码爱编程

作者:CuteXiaoKe 微信公众号:CuteXiaoKe   在本章中,我们将更改pdfHTML插件的两个最重要的内部机制。 我们将覆盖将HTML标签与iText对象匹配的默认功能,更具体地说是Defaul

kubelet源码 删除pod pod_workers.go(三)_kubelet[1067]: e0727 17:10:59.106543 1067 pod_work-爱代码爱编程

kubelet源码 删除pod pod_workers.go(三) 上篇中UpdatePod函数结束,然后进入managePodLoop函数。 UpdatePod负责对pod的状态流程进行更新,对pod状态的标记 mana