zoukankan      html  css  js  c++  java
  • 解决构造器多参数的设计问题

    问题

      在构造类的时候,有些情况下,构造这个类需要的参数会有很多,如果一些参数用户不清楚,你是不是需要自己设定默认值,全部参数都需要提供默认值,这样你的构造方法就需要挺多的了,例如下面这个例子,我是实际参与项目中出现的情况:

    例子

      先针对串口类,串口涉及四个参数,一个是波特率,一个是数据位数,一个是停止位,一个是奇偶位。若是比较粗鲁的写法就是如下:

    /**
     * Port类
     * 代表串口
     * @author Guo
     *
     */
    public class Port {
        private int baud = 1200;        //波特率
        private int databit = 8;        //数据位
        private int stopbit = 1;        //停止位
        private int parity = 0;            //奇偶位
        
        /**
         * 无参数构造方法,串口参数都采用默认的
         */
        public Port() {
            
        }
        
        /**
         * 通过该构造方法设置波特率、数据位、停止位、奇偶位
         * @param baud
         * @param databit
         * @param stopbit
         * @param parity
         */
        public Port(int baud, int databit, int stopbit, int parity) {
            this.baud = baud;
            this.databit = databit;
            this.stopbit = stopbit;
            this.parity = parity;
        }
        
        /**
         * 通过该构造方法设置数据位、停止位、奇偶位,波特率采用默认值
         * @param databit
         * @param stopbit
         * @param parity
         */
        public Port(int databit, int stopbit, int parity) {
            this.databit = databit;
            this.stopbit = stopbit;
            this.parity = parity;
        }
    }

      其实该构造器还有很多种情况,这样的话我们写起来就很麻烦了,而且例如上面的两个构造器都是三个参数的,用起来怎么知道是谁。接下来就提出我们的解决方案。

    方法之JavaBean模式

      为各个参数提供setter方法,通过setter方法去设置属性的值,从而达到用户选择性设置属性值。

    /**
     * Port_JavaBean类
     * 以JavaBean模式去设置属性值
     * @author xujianguo
     */
    public class Port_JavaBean {
        private int baud = 1200;        //波特率
        private int databit = 8;        //数据位
        private int stopbit = 1;        //停止位
        private int parity = 0;         //奇偶位
        
        public Port_JavaBean(){}
        
        /**
         * 为各个属性提供setter方法去设置值
         * @return
         */
        public int getBaud() {
            return baud;
        }
        public void setBaud(int baud) {
            this.baud = baud;
        }
        public int getDatabit() {
            return databit;
        }
        public void setDatabit(int databit) {
            this.databit = databit;
        }
        public int getStopbit() {
            return stopbit;
        }
        public void setStopbit(int stopbit) {
            this.stopbit = stopbit;
        }
        public int getParity() {
            return parity;
        }
        public void setParity(int parity) {
            this.parity = parity;
        }
    }

      这个JavaBean模式一个重要的缺点:

        因为构造过程被分到了几个调用中构造过程中JavaBean可能处于不一致的状态

    方法之Builder模式

      该模式不直接生成想要的对象,而是让客户端调用构造器,得到一个builder对象,然后调用类似setter的方法来设置参数值,这个buidler对象完成后通过这个对象去设置Port类的真正属性。

    /**
     * Port_Builder类
     * 以Builder模式构建类
     * @author xujianguo
     */
    public class Port_Builder {
        private int baud;        //波特率
        private int databit;    //数据位
        private int stopbit;    //停止位
        private int parity;        //奇偶位
        
        public static class Builder {
            //默认值
            private int baud = 1200;
            private int databit = 8;
            private int stopbit = 1;
            private int parity = 0;
            
            public Builder() {}
            
            /**
             * 设置baud属性值
             * @param baud
             * @return
             */
            public Builder setBaud(int baud) {
                this.baud = baud;
                return this;
            }
            
            /**
             * 设置databit属性值
             * @param databit
             * @return
             */
            public Builder setDatabit(int databit) {
                this.databit = databit;
                return this;
            }
            
            /**
             * 设置stopbit属性值
             * @param stopbit
             * @return
             */
            public Builder setStopbit(int stopbit) {
                this.stopbit = stopbit;
                return this;
            }
            
            /**
             * 设置parity属性值
             * @param parity
             * @return
             */
            public Builder setParity(int parity) {
                this.parity = parity;
                return this;
            }
            
            /**
             * 通过Builder里面设置好的属性,创建串口
             * @return
             */
            public Port_Builder build() {
                return new Port_Builder(this);
            }
        }
        
        /**
         * 私有的构造方法,仅提供给Builder创建它的实例
         * @param builder
         */
        private Port_Builder(Builder builder) {
            this.baud = builder.baud;
            this.databit = builder.databit;
            this.stopbit = builder.stopbit;
            this.parity = builder.parity;
        }
    }

       这个模式的最大优点就是首先通过一个Builder类设置好要修改的属性值,然后根据这个Builder对象去创建Port_Builder类,这个就解决了JavaBean模式暴露的状态不一致的问题,而且也具有了JavaBean模式的优点。

  • 相关阅读:
    vagrant 命令+配置+入门案例
    博客园皮肤 Cnblogs-Theme-SimpleMemory
    Vue:前后端交互、路由
    Vue :模块化
    Vue:组件开发
    Vue :模板语法
    ssm实战(11)-----用户功能开发
    ssm实战(10)-----通用功能开发(Windows环境下配置)
    ssm实战(9)-----前端开发(Windows环境下配置)
    spring boot实战——微信点餐系统03:微信授权(用户授权),免费内网穿透(固定ip)
  • 原文地址:https://www.cnblogs.com/rayguo/p/3771369.html
Copyright © 2011-2022 走看看