• 设计模式学习笔记 ———— 简单工厂模式


    # 背景  

      简单工厂模式是很多程序员学习的第一个设计模式,因为其不但原理简单而且易于上手,在日常工作的代码中也常有体现。今天分享一个基于实现“加”、“减”、“乘”、“除”计算器的需求基于简单工厂模式来实现。

    # 错误示范

      在学习简单工厂模式之前,遇到这种需求我是这样实现的:

    public static Double Calculator(Double num1, Double num2, String symbol) throws Exception {
            Double result = 0.0D;
            if (symbol == null || num1 == null || num2 == null) {
                return result;
            }
            switch (symbol) {
                case "+":
                    result = num1 + num2;
                    break;
                case "-":
                    result = num1 - num2;
                    break;
                case "*":
                    result = num1 * num2;
                    break;
                case "/":
                    if (num2 == 0) {
                        throw new Exception("使用除法的时候分母不能为0");
                    }
                    result = num1 / num2;
                    break;
                default:{}
    
            }
            return result;
        }

      简单来说是船舰一个方法,然后通过switch case 一个一个的去判断,然后对比中的进行处理,后续如果有其他判断的话,就继续在下面在增加case判断。那么这段代码实现了需求了,是实现了,但是这段代码是优秀的吗?不是。为什么呢?例如现在客户需求增加一个平方算法,我们在case中增加这个算法,却需要加减乘除的运算都得来参与编译,在这个代码的迭代过程中,如果不小心对原有代码进行了误操作,会造成很糟糕的结果,尤其是这个误操作有可能还不会报错……所以我们应该把加减乘除等运算进行分离,修改其中一个不会影响另外的几个,增加平方算法也不影响其他代码。

      声明父类

    @Data
    public abstract class Operation {
    
        private double num1;
        private double num2;
    
        protected abstract double getResult();
       
    }

      创建多个计算类用于继承父类并重写getResult方法,这里我分别创建了加减乘除四个类来继承Operation类,并重写getResult()方法

    class OperationAdd extends Operation{
    
        @Override
        protected double getResult() {
            return getNum1() + getNum2();
        }
    }
    
    class OperationSub extends Operation {
    
        @Override
        protected double getResult() {
            return getNum1() - getNum2();
        }
    }
    
    class OperationMul extends Operation {
    
        @Override
        protected double getResult() {
            return getNum1() * getNum2();
        }
    }
    
    class OperationDiv extends Operation {
    
        @Override
        protected double getResult() {
            return getNum1() / getNum2();
        }
    }

      此时,我们只需要简单的写一个工程方法就可以实现业务要求了。这里只是实例代码,很多细节判断没有加,如果是在生成环境中,首先入参肯定要校验是否为null,如果为null会报NPE,上面除法运算类中,应该对分母进行判断,是否为0等等……

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

      测试main方法

    public static void main(String[] args) {
            Operation operation = OperationFactory.createOperation("*");
            operation.setNum1(11d);
            operation.setNum2(1.2);
            System.out.println(operation.getResult());
    }    

      返回结果:

    13.2

      

  • 相关阅读:
    (转)关于c#中的事件
    MySql数据库--持续记录ing
    在Eclipse中通过JDBC连接MySQL步骤,非常详细!
    mybatis传入参数类型parameterType和输出结果类型resultType详解
    关于JDBC访问存储过程的问题
    Mybatis(一)入门
    [Redis] 基于redis的分布式锁
    分布式锁----浅析redis实现
    MyBatis的增删改查操作
    C3P0连接池工具类实现步骤及方法
  • 原文地址:https://www.cnblogs.com/joimages/p/11976747.html
Copyright © 2020-2023  润新知