<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ì)模式 —— 建造者模式

          共 4860字,需瀏覽 10分鐘

           ·

          2021-04-17 00:48

          前言

          建造者模式是一種創(chuàng)建型設(shè)計(jì)模式,使你能夠分步驟創(chuàng)建復(fù)雜對(duì)象。該模式允許你使用相同的創(chuàng)建代碼生成不同類(lèi)型和形式的對(duì)象

          一個(gè) Builder 類(lèi)會(huì)一步一步構(gòu)造最終對(duì)象。這個(gè) Builder 類(lèi)是獨(dú)立于其他對(duì)象的。

          1

          使用場(chǎng)景

          在閱讀源碼過(guò)程中經(jīng)常看到建造者模式,主要是為了簡(jiǎn)化復(fù)雜對(duì)象的創(chuàng)建。

          具體那些房子啥的舉例子就不扯了,以實(shí)際工作中的應(yīng)用為主。

          @Builder 注解

          如果小伙伴使用 lombok 這個(gè)框架的話,那一定對(duì) @Builder 這個(gè)注解不會(huì)陌生。

          @Data
          @Builder
          public class UserRespVo {
              /**
               * 用戶名字
               */

              private String userName;

              /**
               * 用戶 id
               */

              private String userId;

              public static void main(String[] args) {

                  UserRespVo respVo = UserRespVo.builder()
                          .userId("liuzhihang")
                          .userName("程序員小航")
                          .build();
              }
          }

          看一下編譯后的 .class 文件。

          public class UserRespVo {
              private String userName;
              private String userId;

              UserRespVo(final String userName, final String userId) {
                  this.userName = userName;
                  this.userId = userId;
              }

              public static UserRespVo.UserRespVoBuilder builder() {
                  return new UserRespVo.UserRespVoBuilder();
              }

              public static class UserRespVoBuilder {
                  private String userName;
                  private String userId;

                  UserRespVoBuilder() {
                  }

                  public UserRespVo.UserRespVoBuilder userName(final String userName) {
                      this.userName = userName;
                      return this;
                  }

                  public UserRespVo.UserRespVoBuilder userId(final String userId) {
                      this.userId = userId;
                      return this;
                  }

                  public UserRespVo build() {
                      return new UserRespVo(this.userName, this.userId);
                  }

              }
          }

          其實(shí)就是在內(nèi)部創(chuàng)建了一個(gè) Builder 的靜態(tài)內(nèi)部類(lèi),以及一個(gè) builder() 方法。這樣就可以進(jìn)行鏈?zhǔn)秸{(diào)用了。

          如果對(duì)于復(fù)雜對(duì)象的創(chuàng)建,小伙伴也可以采用 lombok 的這種方式,先創(chuàng)建 builder 對(duì)象,然后一步一步構(gòu)建對(duì)象。

          在源碼和工作中

          在閱讀源碼,或者是使用開(kāi)源軟件的時(shí)候,經(jīng)常會(huì)遇到建造者模式,比如 OkHttp3Utils

          private static OkHttpClient client = new OkHttpClient
                      .Builder()
                      .readTimeout(60, TimeUnit.SECONDS)
                      .connectTimeout(60, TimeUnit.SECONDS)
                      .writeTimeout(120, TimeUnit.SECONDS)
                      .build();

          比如 Eureka 源碼中 InstanceInfo 的構(gòu)建。

          InstanceInfo.Builder

          比如使用 Elasticsearch 創(chuàng)建 client 的代碼

          RestClient restClient = RestClient.builder(
              new HttpHost("localhost"9200"http"),
              new HttpHost("localhost"9201"http"))
              .build();

          還比如 Mybatis Plus,等等等……

          2

          總結(jié)

          本文介紹了在工作中使用建造者模式,因?yàn)檫@是在工作中經(jīng)常見(jiàn)到的一種設(shè)計(jì)模式。只不過(guò)很多人容易忽略,然后看各種資料,又是房子又是窗戶的,云里霧里,一大堆代碼。

          淡定,淡定,沒(méi)必要的。其實(shí)很多設(shè)計(jì)模式在不知不覺(jué)中已經(jīng)使用了,只不過(guò)沒(méi)有歸納總結(jié)而已。

          相關(guān)資料

          [1]  《深入設(shè)計(jì)模式》:https://refactoringguru.cn/design-patternss
          [2]  封面圖:https://refactoringguru.cn/design-patterns/builder


          - <End /> -




          歷史文章 | 相關(guān)推薦




          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  伊人视频在线观看 | 国产熟妇久久77777 | 日韩做爱视频 | 91五月婷婷华人网站 | 最大看逼网|