Java設(shè)計(jì)模式——建造者模式(Builder Pattern)

建造者模式宿稀,主要用來構(gòu)建復(fù)雜的對(duì)象(變量很多的對(duì)象)。如臺(tái)式電腦赖捌,它包括主板祝沸、內(nèi)存條、CPU還有機(jī)箱等各個(gè)部件越庇,而作為用戶罩锐,一般不關(guān)心這些部件是怎么裝配的唯欣,也幾乎不會(huì)單獨(dú)使用某個(gè)部件搬味,而是使用組裝好了的電腦。所以你只需要給建造者準(zhǔn)備好零部件萍聊,讓建造者給你建造出產(chǎn)品即可悦析。

一般的建造者模式,是使用如下圖的方式亭螟,一個(gè)導(dǎo)演Director持有一個(gè)抽象的Builder跑龍?zhí)椎脑だ樱珼irector調(diào)用自己的construct()命令跑龍?zhí)椎慕ㄔ飚a(chǎn)品Product道媚,construct()方法中是抽象的Builder在buildPart1()、buildPart2()谴分,導(dǎo)演不指定具體的龍?zhí)孜悖灰钟谐橄蟮腂uilder即可薄翅,龍?zhí)椎腷uildPart1()就是在組裝Product產(chǎn)品的具體參數(shù),因?yàn)锽uilder持有Product對(duì)象僧凰。

然而以上并不是Builder pattern的最佳實(shí)踐

builder pattern

如果按上面的套路來训措,那建造一個(gè)類簡(jiǎn)直要人命啊绩鸣,不僅要寫抽象接口,并且代碼不好閱讀化借。因此建造者模式有很多簡(jiǎn)單的變種蓖康,以下才是我認(rèn)為最好的建造者模式垒手,直接上代碼。

Computer這個(gè)產(chǎn)品中有一個(gè)專業(yè)的建造者Builder泳梆,Builder有一個(gè)方法build可以建造出一個(gè)Computer產(chǎn)品优妙,Computer構(gòu)造方法私有化套硼,只有Builder才能創(chuàng)建鼠哥。Builder中有多個(gè)方法接收外部給的零部件看政,等零部件集齊允蚣,Builder就可以調(diào)用build方法建造一臺(tái)Computer產(chǎn)品了。注意最好不要在Builder的構(gòu)造方法中new一個(gè)Computer森渐,而應(yīng)該在builder方法中new,因?yàn)锽uilder構(gòu)造方法執(zhí)行時(shí)竟块,Builder還沒接到零部件耐齐。

package builder;

/**
 * 一臺(tái)電腦
 */
public class Computer {

    private String mainBoard;   // 主板
    private String memory;  // 內(nèi)存
    private String cpu; // cpu

    // 構(gòu)造函數(shù)私有化,不能直接new出一臺(tái)電腦耸携,因?yàn)殡娔X組裝很復(fù)雜夺衍,需要有專業(yè)技能的建造者來建造一臺(tái)電腦
    private Computer(String mainBoard, String memory, String cpu){
        this.mainBoard = mainBoard;
        this.memory = memory;
        this.cpu = cpu;
    }


    // 一般建造者模式為了易維護(hù)沟沙,都把builder設(shè)置為構(gòu)建產(chǎn)品的內(nèi)部靜態(tài)類
    public static class Builder{

        // 建造者需要的參數(shù)跟它所建造的產(chǎn)品一致
        private String mainBoard;   // 主板
        private String memory;  // 內(nèi)存
        private String cpu; // cpu

        // Builder構(gòu)造函數(shù)不能私有,他需要來接受零部件
        public Builder(){

        }

        // Builder接收到零部件后尝胆,存到自己身上含衔,方法都放回Builder自身
        public Builder setMainBoard(String mainBoard){
            this.mainBoard = mainBoard;
            return this;
        }
        public Builder setMemory(String memory){
            this.memory = memory;
            return this;
        }
        public Builder setCpu(String cpu){
            this.cpu = cpu;
            return this;
        }

        // 接收了所有零部件以后二庵,就可以build一個(gè)產(chǎn)品了
        public Computer build(){

            // 這里可以是一個(gè)復(fù)雜的建造Computer的流程催享,可能有對(duì)參數(shù)的一些校驗(yàn),這里就不寫了
            Computer c = new Computer(this.mainBoard, this.memory, this.cpu);
            return c;
        }

    }

    @Override
    public String toString() {
        return "Computer{" +
                "mainBoard='" + mainBoard + '\'' +
                ", memory='" + memory + '\'' +
                ", cpu='" + cpu + '\'' +
                '}';
    }
}

測(cè)試一下:

package builder;

public class BuilderMain {

    public static void main(String[] args) {
        Computer c = new Computer.Builder().setMainBoard("jijia")
                .setCpu("Intel i7")
                .setMemory("8g").build();
        System.out.println(c);
    }
}

測(cè)試成功痰憎,如下:


建造者模式

等等铣耘,上面代碼看起來是不是也很累蜗细,也需要寫大量的代碼,以下強(qiáng)烈推薦Lombok插件踪区,Idea創(chuàng)建springboot initial時(shí)可以把Lombok勾選上即可

使用了Lombok后吊骤,代碼如下白粉,只要一個(gè)@Builder就可以幫你搞定建造者模式。


lombok builder

然后客戶端直接調(diào)用即可或渤。


Lombok
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薪鹦,一起剝皮案震驚了整個(gè)濱河市池磁,隨后出現(xiàn)的幾起案子地熄,更是在濱河造成了極大的恐慌芯杀,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件却特,死亡現(xiàn)場(chǎng)離奇詭異裂明,居然都是意外死亡闽晦,警方通過查閱死者的電腦和手機(jī)提岔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門唧垦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來液样,“玉大人巧还,你說我怎么就攤上這事麸祷“Γ” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵走孽,是天一觀的道長(zhǎng)琳状。 經(jīng)常有香客問我念逞,道長(zhǎng),這世上最難降的妖魔是什么硕盹? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任瘩例,我火速辦了婚禮甸各,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘南吮。我一直安慰自己部凑,他們只是感情好碧浊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布箱锐。 她就那樣靜靜地躺著,像睡著了一般观蜗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墓捻,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天砖第,我揣著相機(jī)與錄音梧兼,去河邊找鬼袱院。 笑死瞭稼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的欲虚。 我是一名探鬼主播悔雹,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼梯找,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了锈锤?” 一聲冷哼從身側(cè)響起久免,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤阎姥,失蹤者是張志新(化名)和其女友劉穎鸽捻,沒想到半個(gè)月后泽腮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诊赊,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豪筝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了团搞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多艇。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡复隆,死狀恐怖姆涩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骨饿,我是刑警寧澤亏栈,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站宏赘,受9級(jí)特大地震影響绒北,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜察署,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一闷游、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贴汪,春花似錦储藐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聂喇。三九已至克饶,卻和暖如春亡脑,著一層夾襖步出監(jiān)牢的瞬間霉咨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工蒜茴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粉私,地道東北人崔泵。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓幌甘,卻偏偏與公主長(zhǎng)得像锅风,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子边器,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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