简单工厂模式(java)

1.提出问题:设计一个简单的计算器功能。

原始版本:

定义减法

private final static String ADD = "+";

public static void main(String[] args) {

    System.out.println("请输入数字A");

    Scanner scannerA = new Scanner(System.in);

    double numberA = scannerA.nextDouble();

    System.out.println("请输入数字B");

    Scanner scannerB = new Scanner(System.in);

    double numberB = scannerB.nextDouble();

    System.out.println("请输入运算符C");

    Scanner scannerC = new Scanner(System.in);

    String operator = scannerC.next();

    if (ADD.equalsIgnoreCase(operator)) {

        System.out.println(numberA + numberB);

    }

}

这样就实现了一个加法计算器,那么问题来了,如果我要为计算器新增减法功能呢?有些同学就说新增一个if判断不就好了?那么问题又来了,我有N个类都用了计算器我们是不是就要去N个地方去修改?是的,那么我们很容易就可以想到利用封装的思想将计算逻辑与控制台输入给分开,改造好的运算逻辑方法,如下:

/**

* 这里用到了封装思想,封装了运算方法,将输入和运算逻辑分开了

* @param numberA 输入的第一个值

* @param numberB 输入的第二个值

* @param operator 运算符

* @author WangHan

* @date 2019/1/21 16:15

*/

private static double operation(double numberA, double numberB, String operator) {

    if (ADD.equalsIgnoreCase(operator)) {

        return numberA + numberB;

    } else if (SUBTRACT.equalsIgnoreCase(operator)) {

        return numberA - numberB;

    }else {

        return 0;

}

}

这样尽管我有N多个地方输入计算值和计算符号,我也可以都调用这一个operation方法来计算结果!这就是封装的思想了。

继续:

如果此时要增加两个运算符*和/,需要修改operation方法让加减法也参与了重新编译,如果不小心将加减法改错那么就是坑爹!

增加需求,尽可能的扩展的来解决问题而不是去修改原来的代码

此时我们新增一个算法的父类Operation:

@Data

public class Operation {

    public double numberA = 0;

    public double numberB = 0;

    public double getResult() {

        return 0;

}

    public static class OperationAdd extends Operation {

        /**

        * 重写getResult方法

        */

        @Override

        public double getResult() {

            return numberA + numberB;

}

}

    public static class OperationSub extends Operation {

        /**

        * 重写getResult方法

        */

        @Override

        public double getResult() {

            return numberA - numberB;

}

}

}

并且新增两个子类OperationAdd 和OperationSub 去继承Operation分别实现加减算法。

新增一个工厂类OperationFactory:

class OperationFactory {

    static Operation createOperation(double numberA, double numberB, String operator) {

        Operation operation;

        switch (operator) {

            case "+":

                operation = new Operation.OperationAdd();

                operation.setNumberA(numberA);

                operation.setNumberB(numberB);

                return operation;

            case "-":

                operation = new Operation.OperationSub();

                operation.setNumberA(numberA);

                operation.setNumberB(numberB);

                return operation;

            default:

                return null;

}

}

}

通过判断运算符去确定我要实例化那个算法的子类就可以了

这样在实现计算器功能的时候就用到了简单工厂模式,我们调用工厂类去实例化算法:

Optional<Operation> optional = Optional.ofNullable(OperationFactory.createOperation(numberA, numberB, operator));

optional.ifPresent(operation ->System.out.println("第三版计算结果:" + operation.getResult()));

学习到这里简答做个笔记!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 3,407评论 0 19
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,407评论 0 9
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,249评论 0 41
  • 一、需求 请用Java实现一个计算机控制台程序,要求输入俩个数和运算符,得到结果。 二、初步实现 三、反思 这种实...
    Mr丶sorrow阅读 694评论 0 0
  • 50道经典Java编程练习题,将数学思维运用到编程中来。抱歉哈找不到文章的原贴了,有冒犯的麻烦知会声哈~ 1.指数...
    OSET我要编程阅读 7,315评论 0 9

友情链接更多精彩内容