天天看點

設計模式--Bulider模式

起因:

最近在做統計計算,建立的實體中屬性比較多,都是一些數值,一開始是通過get、set方法進行指派,占用了很多業務代碼方法的長度,可讀性不太好,後來改用了添加構造器的方式,稍顯精簡了一點,但是每次指派的時候都都必須注意是不是對應上了。最後決定改用Bulider模式,确實好用很多。

下面通過一個實際的demo看一下效果

package com.github.xsh.demo.model;

    /**
     * @description:
     * @date: 2019/5/16
     **/
    public class Student {
    
        private int id;
      
        private String name;
       
        private String passwd;
      
        private String sex;
        
        private String address;
    
        private Student(Builder builder) {
            this.id = builder.id;
            this.name = builder.name;
            this.passwd = builder.passwd;
            this.sex = builder.sex;
            this.address = builder.address;
        }
    
        /**
         * Builder
         */
        public static class Builder {
            private int id;
            private String name;
            private String passwd;
            private String sex;
            private String address;
    
            public Builder(int id, String name) {
                this.id = id;
                this.name = name;
            }
    
            public Builder passwd(String passwd) {
                this.passwd = passwd;
                return this;
            }
    
            public Builder sex(String sex) {
                this.sex = sex;
                return this;
            }
    
            public Builder address(String address) {
                this.address = address;
                return this;
            }
    
            public Student build() {
                return new Student(this);
            }
        }
    
        @Override
        public String toString() {
            return String.format("%s[id=%s, name=%s, passwd=%s, sex=%s, address=%s]",
                    getClass().getSimpleName(), id, name, passwd, sex, address);
        }
    
        //為了使閱讀簡潔,此處省略getter setter
    
    
    }


        @Test
        public void buliderTest(){
            Student student = new Student.Builder(1,"jack")
                    .sex("男士")
                    .address("地球村")
                    .passwd("1232")
                    .build();
            //先填充屬性再建構除對象,看上去是不是逼格滿滿        
            System.out.println(student);
        }           

複制

列印結果如下:

Student[id=1, name=jack, passwd=1232, sex=男士, address=地球村]           

複制

最後做一下總結,什麼是

Bulider模式

不直接生成想要的對象,而是讓用戶端利用所有必要的參數調用構造器(或者靜

态工廠),得到一個 builder 對象 。 然後用戶端在 builder 對象上調用類似于 setter 的方法,來設定每個相關的可選參數。最後用戶端調用無參的build方法來生成通常是不可變的對象

參考閱讀:《Effective java(第3版)》第 2 條:遇到多個構造器參數時要考慮使用建構器

本人首發于個人公衆号:河岸飛流 歡迎訂閱

原文位址:https://mp.weixin.qq.com/s/Tr5rQGnDPti90hTwwHAKzQ

本文參與 騰訊雲自媒體分享計劃 ,歡迎熱愛寫作的你一起參與!

本文分享自作者個人站點/部落格

https://www.cnblogs.com/xieshuang/

複制

如有侵權,請聯系 [email protected] 删除。