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模式的优点。

  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/rayguo/p/3771369.html
Copyright © 2011-2022 走看看