zoukankan      html  css  js  c++  java
  • 设计模式入门-简单工厂模式

    前言

    话说设计模式是我们面试中经常遇到的问题,但是开发中遇到的也不少。之前一直想学设计模式,然后总结写一些文章,但一直忙于其它事情,现在终于要学习设计模式,参考的书籍是《大话设计模式》,这本书写得通俗易懂,推荐大家都去看一下。

    场景描述

    借用书中示例问题,计算两个数的加、减、乘、除等其它运算,一般我们的思维是自上而下处理问题,也就造成了运算两个数就要经过多次判断。

    场景示例

    两个数之前的算法运算,如下面代码所示:

    package me.xueyao;
    /**
     * @author Simon.Xue
     * @date 2019-12-30 22:54
     **/
    public class OperationHello {
    
        public static void main(String[] args) {
            System.out.println(getResult("*", 1, 3));
        }
    
        public static int getResult(String operationStr, int number1, int number2) {
            int result = 0;
            switch (operationStr) {
                case "+":
                    result = number1 + number2;
                    break;
                case "-":
                    result = number1 - number2;
                    break;
                case "*":
                    result = number1 * number2;
                    break;
                case "/":
                    result = number1 / number2;
                    break;
            }
            return result;
        }
    }
    

    此处的代码要判断四次,但是如果再增加其它的运算,会在原来基础上又增加条件判断。以后,随着业务有扩展会不停添加判断条件。代码的耦合度会越来越高,如果修改某一处运算的问题,就造成线上业务不能访问相关运算的功能,必须要修改好问题,其它的运算功能才能使用。

    解决办法

    现在可以用到我们所说的简单工厂模式,首先,我们要想,加、减、乘、除运算都属于运算子类,所以我们创建一个运算父类Operation .class

    package me.xueyao;
    
    /**
     * @author Simon.Xue
     * @date 2019-12-30 22:18
     **/
    public abstract class Operation {
    
        private int number1;
        private int number2;
    
        public int getNumber1() {
            return number1;
        }
    
        public void setNumber1(int number1) {
            this.number1 = number1;
        }
    
        public int getNumber2() {
            return number2;
        }
    
        public void setNumber2(int number2) {
            this.number2 = number2;
        }
    
        public abstract int getResult();
    }
    

    加、减、乘、除四则运算,我们分别创建OperationAdd.class,OperationSub.class,OperationMul.class,OperationDiv.class四个子类分别继承运算父类Operation.class, 实现其中计算方法。

    package me.xueyao;
    
    /**
     * @author Simon.Xue
     * @date 2019-12-30 22:22
     **/
    public class OperationAdd extends Operation {
    
        @Override
        public int getResult() {
            return getNumber1() + getNumber2();
        }
    }
    
    package me.xueyao;
    
    /**
     * @author Simon.Xue
     * @date 2019-12-30 22:22
     **/
    public class OperationSub extends Operation {
    
        @Override
        public int getResult() {
            return getNumber1() - getNumber2();
        }
    }
    
    package me.xueyao;
    
    /**
     * @author Simon.Xue
     * @date 2019-12-30 22:25
     **/
    public class OperationMul extends Operation {
        @Override
        public int getResult() {
            return getNumber1() * getNumber2();
        }
    }
    
    package me.xueyao;
    
    /**
     * @author Simon.Xue
     * @date 2019-12-30 22:26
     **/
    public class OperationDiv extends Operation {
        @Override
        public int getResult() {
            return getNumber1() / getNumber2();
        }
    }
    

    当我们要使用运算方法时,只需要创建其对象,再执行计算方法,便可计算两个数的运算,但是现在又有一个问题,就是每种运算方式都要创建对象。都要暴露父类对象,我们可以创建一个工厂类,由工厂类来创建所需要的对象,如下代码如示

    package me.xueyao;
    
    /**
     * @author Simon.Xue
     * @date 2019-12-30 22:30
     **/
    public class OperationFactory {
    
        public static Operation createOperation(String operationStr) {
            Operation operation = null;
    
            switch (operationStr) {
                case "+":
                    operation = new OperationAdd();
                    break;
                case "-":
                    operation = new OperationSub();
                    break;
                case "*":
                    operation = new OperationMul();
                    break;
                case "/":
                    operation = new OperationDiv();
                    break;
            }
            return operation;
        }
    }
    

    总结

    简单工厂模式,是设计模式中比较简单的一种模式,但是它每多出一种需求,就要创建一个类,总体来说用起来还不错。文章如有问题,请联系我。

  • 相关阅读:
    UVa1225 Digit Counting
    UVa1586 Molar mass
    UVa1585 Score
    Java中的Set
    CentOS6.5 格式化大磁盘
    Ganglia监控Hadoop与HBase集群
    Hadoop HA + HBase环境搭建(二)————HBase环境搭建
    Hadoop HA + HBase环境搭建(一)————zookeeper和hadoop环境搭建
    在树莓派上安装MongoDB
    编译运行hadoop程序
  • 原文地址:https://www.cnblogs.com/loveyous/p/12122264.html
Copyright © 2011-2022 走看看