<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          設(shè)計(jì)模式之建造者模式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)建類型

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

          應(yīng)用場景:

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

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

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

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

          實(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)鏈?zhǔ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(){
                      //校驗(yàn)邏輯放到build()方法之前,先校驗(yàn) 再 創(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)一進(jìn)行處理,到最終創(chuàng)建完成


          瀏覽 33
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  高清无码一级 | 久久国产精品毛片 | 国产伦理,久久做,天天做 | 日本黄色影视 | 日韩一区二区视频 |