設計模式讀書筆記(三)Builder 模式

1. Builder 模式的簡單實現(xiàn)(書中例子)

public abstract class Computer {

    protected String mBoard;

    protected String mDisplay;

    protected String mOS;

    protected Computer() {

    }

    public void setBoard(String board) {
        mBoard = board;
    }

    public void setDisplay(String display) {
        mDisplay = display;
    }

    public abstract void setOS();
}
public class Macbook extends Computer {

    protected Macbook() {

    }

    @Override
    public void setOS() {
        mOS = "Mac OS X";
    }
}
public abstract class Builder {

    public abstract void buildBoard(String board);

    public abstract void buildDisplay(String display);

    public abstract void buildOS();

    public abstract Computer create();
}
public class MacbookBuilder extends Builder {

    private Computer mComputer = new Macbook();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildDisplay(String display) {
        mComputer.setDisplay(display);
    }

    @Override
    public void buildOS() {
        mComputer.setOS();
    }

    @Override
    public Computer create() {
        return mComputer;
    }
}
public class Director {

    Builder mBuilder;

    public Director(Builder builder) {
        mBuilder = builder;
    }

    public void construct(String board, String display) {
        mBuilder.buildBoard(board);
        mBuilder.buildDisplay(display);
        mBuilder.buildOS();
    }
}

書中給出的 Builder 模式實現(xiàn)灌旧,最終通過調用 Director 對象的 construct() 方法來構建 Computer坪哄,在學習工作中彰触,我們經(jīng)常能看到 Builder 模式的另一種實現(xiàn)模式梯投,直接通過鏈式調用 Builder 對象來構建。下面以 OkHttp 中的 Request Builder 舉例况毅,來看看他是怎么實現(xiàn) Builder 模式的分蓖。

public static class Builder {
    HttpUrl url;
    String method;
    Headers.Builder headers;
    RequestBody body;
    Object tag;

    public Builder() {
        this.method = "GET";
        this.headers = new Headers.Builder();
    }

    Builder(Request request) {
        this.url = request.url;
        this.method = request.method;
        this.body = request.body;
        this.tag = request.tag;
        this.headers = request.headers.newBuilder();
    }

    // Builder 的 set 方法,都會返回 Builder 自己尔许,這樣就可以鏈式調用
    public Builder url(HttpUrl url) {
        if (url == null) throw new NullPointerException("url == null");
        this.url = url;
        return this;
    }

    // ……
    
    // 最后構建的時候咆疗,將 Builder 對象自身作為 Request 構造方法參數(shù)傳入,Request 通過提取 Builder 對象中的屬性母债,來構建自身
    public Request build() {
        if (url == null) throw new IllegalStateException("url == null");
        return new Request(this);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尝抖,隨后出現(xiàn)的幾起案子毡们,更是在濱河造成了極大的恐慌,老刑警劉巖昧辽,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衙熔,死亡現(xiàn)場離奇詭異,居然都是意外死亡搅荞,警方通過查閱死者的電腦和手機红氯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門框咙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痢甘,你說我怎么就攤上這事喇嘱。” “怎么了塞栅?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵者铜,是天一觀的道長。 經(jīng)常有香客問我放椰,道長作烟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任砾医,我火速辦了婚禮拿撩,結果婚禮上,老公的妹妹穿的比我還像新娘如蚜。我一直安慰自己压恒,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布怖亭。 她就那樣靜靜地躺著涎显,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兴猩。 梳的紋絲不亂的頭發(fā)上期吓,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音倾芝,去河邊找鬼讨勤。 笑死,一個胖子當著我的面吹牛晨另,可吹牛的內(nèi)容都是我干的潭千。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼借尿,長吁一口氣:“原來是場噩夢啊……” “哼刨晴!你這毒婦竟也來了?” 一聲冷哼從身側響起路翻,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狈癞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茂契,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶桶,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年掉冶,在試婚紗的時候發(fā)現(xiàn)自己被綠了真竖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脐雪。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恢共,靈堂內(nèi)的尸體忽然破棺而出战秋,到底是詐尸還是另有隱情,我是刑警寧澤旁振,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布获询,位于F島的核電站,受9級特大地震影響拐袜,放射性物質發(fā)生泄漏吉嚣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一蹬铺、第九天 我趴在偏房一處隱蔽的房頂上張望尝哆。 院中可真熱鬧,春花似錦甜攀、人聲如沸秋泄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恒序。三九已至,卻和暖如春谁撼,著一層夾襖步出監(jiān)牢的瞬間歧胁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工厉碟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喊巍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓箍鼓,卻偏偏與公主長得像崭参,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子款咖,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容