設計模式之建造者模式

1、初識建造者模式

建造者模式屬于創(chuàng)建型模式碑宴。比如說:樓房是千差萬別的梗肝,樓房的外形颁糟,層數(shù),內(nèi)部房間的數(shù)量喉悴,房間的裝飾都不一樣棱貌。但是對于建造者來說,抽象出來的建筑流程是確定的箕肃。因為建筑一座樓房婚脱,都可以歸納為幾個步驟:1打樁、2建地基勺像、3搭框架障贸、4內(nèi)部建設。同理吟宦,建造者設計模式也是基于這樣的概念而生的篮洁,這個設計模式用來解決什么樣的情況呢:即流程不變,但每個流程實現(xiàn)的具體細節(jié)是會變化的殃姓。這樣的情況袁波,可以考慮使用建造者。就像蓋房子蜗侈,4個流程都必須有篷牌,但每個流程各自的實現(xiàn)細節(jié),各個房子各有不同宛篇。建造者模式的好處就是保證了流程不會變化娃磺,即流程不會增加也不會遺漏,也不會產(chǎn)生流程次序的錯誤叫倍。而建造者模式偷卧,保證了流程的確定性,而流程內(nèi)部的實現(xiàn)細節(jié)吆倦,是可繼承擴展的听诸。從根源上解決了流程不規(guī)范的問題。

擼代碼的時候蚕泽,如果你遇到一個需要把控流程晌梨,但流程中的實現(xiàn)細節(jié)各有許多的方式,你可以采用建造者模式须妻。用一個director類把控流程仔蝌,而用許多不同的builder去建造流程中的細節(jié)并產(chǎn)生產(chǎn)品。這樣荒吏,生產(chǎn)出來的產(chǎn)品基本是不會出問題的敛惊。因為流程把控好了。你可以有多個builder去負責建造生產(chǎn)產(chǎn)品绰更,而讓director去把控流程瞧挤。如果有新的產(chǎn)品锡宋,但是流程一致,你可以再擴張出一個builder來特恬。這樣执俩,你看,建造者模式是不是很符合OCP原則呢癌刽。

2役首、建造者模式的概念

將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以有不同的表示妒穴。

大概的意思是說:一套的構建過程可以有不同的產(chǎn)品(表示)出來宋税。這些產(chǎn)品(表示)都按照這一套的構建過程被生產(chǎn)出來摊崭。

建造者模式通常包括以下這幾個角色:

  • Builder:給出一個抽象接口讼油,規(guī)范建造者對于生產(chǎn)的產(chǎn)品的各個組成部分的建造。這個接口只是定一個規(guī)范呢簸,不涉及具體的建造矮台,具體的建造讓繼承于它的子類(ConcreteBuilder)去實現(xiàn)

  • ConcreteBuilder:實現(xiàn)builder接口,針對不同的商業(yè)邏輯根时,具體化各對象部分的建造瘦赫,最后返回一個建造好的產(chǎn)品。實現(xiàn)抽象類的所有未實現(xiàn)的方法蛤迎,具體來說一般是兩項任務:組建產(chǎn)品确虱;返回組建好的產(chǎn)品。

  • Director:導演(負責人)替裆,顧名思義校辩,負責規(guī)范流程之用。在指導中不涉及產(chǎn)品的創(chuàng)建辆童,只負責保證復雜對象各部分被創(chuàng)建或按某種順序創(chuàng)建宜咒。導演類一般不與產(chǎn)品類發(fā)生依賴關系,與導演類直接交互的是建造者類把鉴。一般來說故黑,導演類被用來封裝程序中易變的部分。

  • Product:復雜對象庭砍。

建造者模式的UML圖(通過圖形來串聯(lián)自己所學的知識是非常高效的學習方式之一)

Paste_Image.png

3场晶、一個建造者的實例。

汽車的構造當中怠缸,包括汽車品牌诗轻、型號、價格凯旭、產(chǎn)地等等概耻。

復雜對象Product

/**
 * 復雜對象Product,這里是汽車
 * @author Administrator
 *
 */
public class Car {

    private String name; //汽車品牌
    private String type; //具體的型號
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    
}

抽象的Builder:

/**
 * 抽象的構造者
 * @author Administrator
 *
 */
public interface Builder {
    
    /**
     * 一般包含2個部分:1使套、抽象的建造方法;2:返回建造好的復雜對象
     * @param name
     */
    
    void buildName(String name);
    void buildType(String type);
    Car build();
}

具體的建造者

/**
 * 具體的構建者
 * @author Administrator
 *
 */
public class ConstractBuilder implements Builder{
    
    Car car = new Car();
    
    @Override
    public void buildName(String name) {
        
        car.setName(name);
        
    }

    @Override
    public void buildType(String type) {
        
        car.setType(type);
    }
    
    @Override
    public Car build() {
        
        return car;
    }
}

導演鞠柄,負責流程規(guī)范侦高,在導演類中可以注入建造者對象。

/**
 * 導演(負責人)負責流程規(guī)范厌杜,
 * @author Administrator
 *
 */
public class Director {
    public Car buildCar1(){
        ConstractBuilder builder = new ConstractBuilder();
        builder.buildName("寶馬");
        builder.buildType("x6");
        return builder.build();
    }
    
    public Car buildCar2(){
        ConstractBuilder builder = new ConstractBuilder();
        builder.buildName("奔馳");
        builder.buildType("c200");
        return builder.build();
    }
}

** 客戶端調(diào)用**

public class Client {

    public static void main(String[] args) {
        Director director = new Director(); //創(chuàng)建導演類
        //構造對象
        Car car1 = director.buildCar1();
        Car car2 = director.buildCar2();
        System.out.println("car1 name:"+car1.getName()+"  type:"+car1.getType());
        System.out.println("car2 name:"+car2.getName()+"  type:"+car2.getType());
    }
}

** 4奉呛、使用建造者模式的好處**

  • 使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié)。
  • 具體的建造者類之間是相互獨立的夯尽,對系統(tǒng)的擴展非常有利瞧壮。
  • 由于具體的建造者是獨立的,因此可以對建造過程逐步細化匙握,而不對其他的模塊產(chǎn)生任何影響咆槽。

5、使用建造者模式的場合

  • 創(chuàng)建一些復雜的對象時圈纺,這些對象的內(nèi)部組成構件間的建造順序是穩(wěn)定的秦忿,但是對象的內(nèi)部組成構件面臨著復雜的變化
  • 要創(chuàng)建的復雜對象的算法,獨立于該對象的組成部分蛾娶,也獨立于組成部分的裝配方法時灯谣。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛔琅,隨后出現(xiàn)的幾起案子胎许,更是在濱河造成了極大的恐慌,老刑警劉巖罗售,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜窑,死亡現(xiàn)場離奇詭異,居然都是意外死亡莽囤,警方通過查閱死者的電腦和手機谬擦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朽缎,“玉大人惨远,你說我怎么就攤上這事』靶ぃ” “怎么了北秽?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長最筒。 經(jīng)常有香客問我贺氓,道長,這世上最難降的妖魔是什么床蜘? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任辙培,我火速辦了婚禮蔑水,結果婚禮上,老公的妹妹穿的比我還像新娘扬蕊。我一直安慰自己搀别,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布尾抑。 她就那樣靜靜地躺著歇父,像睡著了一般。 火紅的嫁衣襯著肌膚如雪再愈。 梳的紋絲不亂的頭發(fā)上榜苫,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音翎冲,去河邊找鬼垂睬。 笑死,一個胖子當著我的面吹牛府适,可吹牛的內(nèi)容都是我干的羔飞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼檐春,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了么伯?” 一聲冷哼從身側(cè)響起疟暖,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎田柔,沒想到半個月后俐巴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡硬爆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年欣舵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀磕。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡缘圈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袜蚕,到底是詐尸還是另有隱情糟把,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布牲剃,位于F島的核電站遣疯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凿傅。R本人自食惡果不足惜缠犀,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一数苫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辨液,春花似錦文判、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亡鼠,卻和暖如春赏殃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背间涵。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工仁热, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勾哩。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓抗蠢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親思劳。 傳聞我的和親對象是個殘疾皇子迅矛,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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

  • 建造者模式(Builder Pattern)也叫做生成器模式,今天讓我們一起學習一下建造者模式。 一潜叛、基本介紹 建...
    冰鑒IT閱讀 690評論 2 8
  • 建造者模式 想象一下秽褒,我們想要創(chuàng)建一個由多個部分構成的對象,而且它的構成需要一步接一步地完成威兜。只有當各個部分都創(chuàng)建...
    英武閱讀 2,194評論 1 50
  • 模式定義 建造者模式:將一個復雜產(chǎn)品的創(chuàng)建與表示分離销斟,使得同樣的創(chuàng)建過程可以創(chuàng)建不同的表示客戶端不用去關心產(chǎn)品對象...
    C_zx閱讀 508評論 1 5
  • 建造者模式 定義 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示椒舵。 首先這是一個復雜的對...
    晨鳴code閱讀 844評論 0 1
  • 最近一直想寫些點兒什么蚂踊,卻又不知道該如何下筆,直到現(xiàn)在笔宿,我都在為住宿而煩惱犁钟,不是因為懼怕黑夜,而是因為懼怕分離措伐。但...
    茉蓆森皌兒閱讀 188評論 0 1