設(shè)計模式-Builder設(shè)計模式

Builder(建造者)設(shè)計模式的定義

將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

使用套路

  • 靜態(tài)內(nèi)部類使用鏈式調(diào)用的方式來設(shè)置類的表現(xiàn)形式
  • 私有外部類的構(gòu)造方法,通過靜態(tài)內(nèi)部來獲取參數(shù)進行表現(xiàn)

強調(diào)

  • 鏈式調(diào)用并不是Builder設(shè)計模式,只是一種手法,來提高編碼速度和代碼可讀性,如:RxJava 將鏈式編程用到的極致。想必有一些人會把 鏈式調(diào)用Builder設(shè)計模式 混為一談。

    Flowable.just("Hello world")
      .subscribe(new Consumer<String>() {
       @Override public void accept(String s) {
        System.out.println(s);
          }
      });
    

類圖

Buidler設(shè)計模式類圖.png
  • Director: 統(tǒng)一組裝的過程
  • Builder: 抽象的Builder類
  • ConcreateBuilder: 具體的Builder類
  • Product: 產(chǎn)品的抽象類

上面描述的是經(jīng)典的Builder設(shè)計模式的類圖,但是我們在實際使用過程中為了避免產(chǎn)生多余的對象,消耗多余的內(nèi)存,Direcotr 通常是被省略掉。而是通過 Builder 來進行組裝,并且通過鏈式調(diào)用來設(shè)置參數(shù)。

示例代碼

示例1

public class Human {
    private final String mNo;
    private final String mName;
    private final int mAge;

    private Human(Builder builder) {
        this.mNo = builder.no;
        this.mName = builder.name;
        this.mAge = builder.age;
    }

    public int getAge() {
        return mAge;
    }

    public String getName() {
        return mName;
    }

    public String getNo() {
        return mNo;
    }

    public static class Builder {
        private final String no;
        private String name;
        private int age;

        public Builder(String no) {
            this.no = no;
        }

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setAge(int age) {
            this.age = age;
            return this;
        }

        public Human build() {
            return new Human(this);
        }
    }
}
調(diào)用
    Human human = new Human.Builder("123456")
            .setName("lisi")
            .setAge(20)
            .build();

上面一段代碼是一個基本的 Builder設(shè)計模式的代碼。通過實例化 Human 中的 Builder 對象來設(shè)置屬性,最后我們在調(diào)用 build() 方法實例化 Human 對象。而且我們可以在 build() 中進行一些判空和數(shù)據(jù)初始化。

public Human build() {
        if (TextUtils.isEmpty(name)) {
            name = "未知";
        }
        return new Human(this);
}

示例2

之前在Logger源碼分析理解時,它的 PrettyFormatStrategyCsvFormatStrategy 均使用了 Builder設(shè)計模式,但是與 示例1 稍有些不同。

public class Human {
    private final String mNo;
    private final String mName;
    private final int mAge;

    private Human(Builder builder) {
        this.mNo = builder.no;
        this.mName = builder.name;
        this.mAge = builder.age;
    }

    public static Builder newBuilder(String no) {
        return new Builder(no);
    }

    public int getAge() {
        return mAge;
    }

    public String getName() {
        return mName;
    }

    public String getNo() {
        return mNo;
    }

    public static class Builder {
        private final String no;
        private String name;
        private int age;

        private Builder(String no) {
            this.no = no;
        }

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setAge(int age) {
            this.age = age;
            return this;
        }

        public Human build() {
            if (TextUtils.isEmpty(name)) {
                name = "未知";
            }
            return new Human(this);
        }
    }
}
調(diào)用
Human human = Human.newBuilder("123456")
            .setName("lisi")
            .setAge(20)
            .build();

總結(jié)

  • Builder 在很多系統(tǒng)框架以及第三框架中都有使用,如:AlertDialog,OkHttp等,可以通過理解它們的源碼進行更深的學(xué)習(xí)
  • 如果類中有很多參數(shù),并且有很多參數(shù)都是有默認值的時候就可以使用 Buidler設(shè)計模式
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,724評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評論 25 708
  • 定義 Builder模式可以將一個類的構(gòu)建和表示進行分離 NavigationBar實踐 1.目的效果 2.分析 ...
    woochen123閱讀 279評論 0 0
  • 結(jié)束了一場場大學(xué)的考試,開始了久違的35天寒假。假期還沒開始的時候就早早的制定了一系列的計劃,那些突然冒出來的小夢...
    葉語yy閱讀 525評論 0 1
  • 原文來自O(shè)ptimization Overview 優(yōu)化的總覽 軟件級別的優(yōu)化 表的結(jié)構(gòu)是不是設(shè)計的很差?這些列是...
    walker_liu_fei閱讀 259評論 0 0

友情鏈接更多精彩內(nèi)容