1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        設(shè)計模式之建造者模式Builder

        共 7079字,需瀏覽 15分鐘

         ·

        2021-06-26 00:54

        建造者模式:

        創(chuàng)建者模式隱藏了復(fù)雜對象的創(chuàng)建過程,它把復(fù)雜對象的創(chuàng)建過程加以抽象,通過子類繼承或者重載的方式,動態(tài)的創(chuàng)建具有復(fù)合屬性的對象。通俗的講就是 創(chuàng)建可裝配的復(fù)雜對象

        建造者模式,屬于創(chuàng)建類型

        實際代碼我放在了Github: https://github.com/liangtengyu/DesignPatterns-for-Java

        應(yīng)用場景:

        學(xué)習(xí)一個設(shè)計模式之前 我們先了解它的使用場景能夠幫我們更快的理解它,實現(xiàn)方式:

        • 當(dāng)使用new()時 參數(shù)過多容易導(dǎo)致混亂和BUG的產(chǎn)生

          • 使用set方法賦值時 會創(chuàng)建一個可變對象,即對象創(chuàng)建完后還可以使用set方法改變變量,此時應(yīng)該使用builer
          • 使用new關(guān)鍵字創(chuàng)建對象時,對于入?yún)⒌男r灡容^混亂
          • 使用set方法時,對于入?yún)⒌男r灡容^分散,不容易集中管理
          • 當(dāng)一個類的構(gòu)造函數(shù)參數(shù)個數(shù)超過4個,而且這些參數(shù)有些是可選的參數(shù),考慮使用構(gòu)造者模式。
        • 使用Builder的好處

          • 將入?yún)⒌男r炦壿嫸挤庋b到build()方法中,進行統(tǒng)一的處理,處理完成才創(chuàng)建對象,否則不創(chuàng)建對象,方便管理校驗邏輯
          • 使用build方法創(chuàng)建對象后,對象無法通過set方法進行修改參數(shù),保證了對象的不可變

        實現(xiàn)方式:

        例:

        public class ResourceConfig {


            private String name;
            private int maxTotal;
            private int maxIdle;
            private int minIdle;

            private ResourceConfig(ResourceConfigBuilder builder) {
                this.name = builder.name;//使用static 內(nèi)部類可以直接拿屬性
                this.maxTotal = builder.getMaxTotal();//也可以通過get方法獲取
                this.maxIdle = builder.getMaxIdle();
                this.minIdle = builder.getMinIdle();
            }

            public String getName() {
                return name;
            }

            public int getMaxTotal() {
                return maxTotal;
            }

            public int getMaxIdle() {
                return maxIdle;
            }

            public int getMinIdle() {
                return minIdle;
            }

            @Override
            public String toString() {
                return "ResourceConfig{" +
                        "name='" + name + '\'' +
                        ", maxTotal=" + maxTotal +
                        ", maxIdle=" + maxIdle +
                        ", minIdle=" + minIdle +
                        '}';
            }




            public static class ResourceConfigBuilder {
                private static final  int DEF_MAX_TOTAL = 8 ;
                private static final  int DEF_MAX_IDLE=0;
                private static final  int DEF_MIN_IDLE=0;

                private String name;
                private int maxTotal=DEF_MAX_TOTAL;
                private int maxIdle = DEF_MAX_IDLE;
                private int minIdle = DEF_MIN_IDLE;

                public ResourceConfigBuilder setName(String name) {
                    this.name = name;
                    return this;//返回this 能夠?qū)崿F(xiàn)鏈式調(diào)用
                }

                public ResourceConfigBuilder setMaxTotal(int maxTotal) {
                    this.maxTotal = maxTotal;
                    return this;
                }

                public ResourceConfigBuilder setMaxIdle(int maxIdle) {
                    this.maxIdle = maxIdle;
                    return this;
                }

                public ResourceConfigBuilder setMinIdle(int minIdle) {
                    this.minIdle = minIdle;
                    return this;
                }

                public String getName() {
                    return name;
                }

                public int getMaxTotal() {
                    return maxTotal;
                }

                public int getMaxIdle() {
                    return maxIdle;
                }

                public int getMinIdle() {
                    return minIdle;
                }

                public ResourceConfig build(){
                    //校驗邏輯放到build()方法之前,先校驗 再 創(chuàng)建
                    if (minIdle > maxTotal) {
                        throw new IllegalArgumentException("無效的參數(shù), cause : minIdle > maxTotal");
                    }
                    return new ResourceConfig(this);
                }
            }
        }

        總結(jié)-抽象理解

        創(chuàng)建對象我們可以通過工廠方法和builder

        • 工廠方法相當(dāng)于對同類工廠抽象,如:披薩 漢堡 同是KFC的產(chǎn)品. 定向生產(chǎn)這2種產(chǎn)品工廠,披薩工廠 漢堡工廠

        • Builder相當(dāng)于對于一種類的創(chuàng)建過程繁瑣的抽象,如 披薩 我們在創(chuàng)建過程中想用什么肉類,什么蔬菜,甜還是咸,創(chuàng)建之前統(tǒng)一進行處理,到最終創(chuàng)建完成


        瀏覽 33
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            两根一前一后挺进她的身体视频 | 黑人玩弄人妻一区二区三区视频 | 18禁久久 | 五月丁香婷婷成人 | 色阁五月| 青娱乐亚洲高清在线视频 | 紧窄粉嫩被粗大撑开 | 一级a一级a爱片免费免免韩国 | 91毛片在线| 中文字幕23页 |