設(shè)計(jì)模式之建造者模式

建造者模式

為什么使用及建造者模式

就以《大話設(shè)計(jì)模式》中的案例來說吧豪嚎,中國(guó)人做飯搔驼,同一個(gè)魚香肉絲,不同的廚師做出來就很容易不同侈询。而且有可能這個(gè)缺鹽舌涨、那個(gè)缺醋,怎么么辦呢扔字?可以向麥當(dāng)勞學(xué)習(xí)囊嘉∥录迹基本上全中國(guó)的麥當(dāng)勞都是一個(gè)口味,為什么扭粱?因?yàn)辂湲?dāng)勞餐飲流程基本上被寫死舵鳞,這個(gè)肉炸幾分鐘,這個(gè)餅烤幾分鐘焊刹。系任。。這樣做出來的飯自然味道上都大差不差虐块。因此從麥當(dāng)勞的經(jīng)驗(yàn)來看俩滥,應(yīng)當(dāng)給小廚子定一個(gè)做魚香肉絲的流程,一個(gè)步驟接著另一個(gè)步驟贺奠,至于每個(gè)步驟具體怎么做霜旧,那肯定要靠小廚子自己以免廚師忘記。

而且這還不夠儡率,試想一下我們吃魚香肉絲的場(chǎng)景挂据,經(jīng)常有人對(duì)老板說多放點(diǎn)辣、少放點(diǎn)辣之類的儿普、把菜炒老點(diǎn)崎逃,這也正常嘛,畢竟每個(gè)人的口味不一樣眉孩。但如果只寫一個(gè)統(tǒng)一的步驟个绍,那么小廚子在做飯的時(shí)候就不好控制。怎么辦呢浪汪?專門找一個(gè)人巴柿,就叫他廚師長(zhǎng)吧,負(fù)責(zé)指揮小廚子們干活死遭,在分配任務(wù)的時(shí)候把顧客的特殊需求告訴響應(yīng)的小廚子广恢。并且,因?yàn)樾N子手藝不是太好呀潭,每人就先做一個(gè)固定口味的魚香肉絲钉迷。

代碼樣例

我說的比較混亂,結(jié)合和具體的代碼可能會(huì)好點(diǎn):

整體步驟Procedure.java

package builder;

/**
 * @author: OnlyOne
 * @create: 2020-08-26 18:34
 * @description: 做魚香肉絲的整體步驟钠署,抽象建造者類篷牌,強(qiáng)制規(guī)定做魚香肉絲有哪些步驟
 **/
public abstract class Procedure {

    /**
     * @description: 第一步:放油
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []       
     * @return void
     **/
    public abstract void putOil();

    /**
     * @description: 第二部:放鹽
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []       
     * @return void
     **/
    public abstract void putSalt();

    /**
     * @description: 第三部:炒菜
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []       
     * @return void
     **/
    public abstract void hotVegetables();

    /**
     * @description: 上菜
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     * @return YuXiangRouSi
     **/
    public abstract YuXiangRouSi Serve();
}

魚香肉絲:YuXiangRouSi.java

package builder;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: OnlyOne
 * @create: 2020-08-26 18:29
 * @description: 產(chǎn)品類,一個(gè)產(chǎn)品分為A,B兩部分
 **/
public class YuXiangRouSi {

    List<String> steps = new ArrayList<String>();

    public void add(String step) {
        steps.add(step);
    }

    public void show() {
        System.out.println("這盤菜的制作過程:");
        for (String step :
                steps) {
            System.out.println(step);
        }
    }

}

廚師長(zhǎng):HeadCooker.java

package builder;

/**
 * @author: OnlyOne
 * @create: 2020-08-26 18:42
 * @description: 指揮者類踏幻,廚師長(zhǎng)枷颊,根據(jù)顧客的不同需求做不同版本的魚香肉絲
 **/
public class HeadCooker {

    /**
     * @description: 廚師長(zhǎng)指揮小廚子們做飯
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: [procedure]       
     * @return void
     **/
    public void direct(Procedure procedure) {
        //第一步,放油
        procedure.putOil();
        //第二部,放鹽
        procedure.putSalt();
        //第三部夭苗,炒菜
        procedure.hotVegetables();
        //上菜
        procedure.Serve();
    }
}

小廚子A:CookerA.java

package builder;

/**
 * @author: OnlyOne
 * @create: 2020-08-26 18:38
 * @description: 具體建造者類,小廚子A,專門做魚香肉絲清淡版信卡,少油、少鹽题造、菜生
 **/
public class CookerA extends Procedure {

    private YuXiangRouSi yuXiangRouSi = new YuXiangRouSi();

    /**
     * @return void
     * @description: 第一步:放油
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     **/
    @Override
    public void putOil() {
        yuXiangRouSi.add("放入少量的油");
    }

    /**
     * @return void
     * @description: 第二部:放鹽
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     **/
    @Override
    public void putSalt() {
        yuXiangRouSi.add("放入少量的鹽");
    }

    /**
     * @return void
     * @description: 第三部:炒菜
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     **/
    @Override
    public void hotVegetables() {
        yuXiangRouSi.add("小火翻炒");
    }

    /**
     * @return YuXiangRouSi
     * @description: 上菜
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     **/
    @Override
    public YuXiangRouSi Serve() {
        return yuXiangRouSi;
    }
}

小廚子B:CookerB.java

package builder;

/**
 * @author: OnlyOne
 * @create: 2020-08-26 18:38
 * @description: 具體建造者類傍菇,小廚子B,專門做魚香肉絲爽辣版,多油界赔、多鹽丢习,菜熟
 **/
public class CookerB extends Procedure {

    private YuXiangRouSi yuXiangRouSi = new YuXiangRouSi();

    /**
     * @return void
     * @description: 第一步:放油
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     **/
    @Override
    public void putOil() {
        yuXiangRouSi.add("放入大量的油");
    }

    /**
     * @return void
     * @description: 第二部:放鹽
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     **/
    @Override
    public void putSalt() {
        yuXiangRouSi.add("放入大量的鹽");
    }

    /**
     * @return void
     * @description: 第三部:炒菜
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     **/
    @Override
    public void hotVegetables() {
        yuXiangRouSi.add("大火翻炒");
    }

    /**
     * @return YuXiangRouSi
     * @description: 上菜
     * @author: OnlyOne
     * @create: 2020/8/26
     * @param: []
     **/
    @Override
    public YuXiangRouSi Serve() {
        return yuXiangRouSi;
    }

}

顧客:Main.java

package builder;

/**
 * @author: OnlyOne
 * @create: 2020-08-26 18:43
 * @description: 客戶端
 **/
public class Main {
    public static void main(String[] args) {
        HeadCooker headCooker = new HeadCooker();
        Procedure cookerA = new CookerA();
        Procedure cookerB = new CookerB();

        // 顧客點(diǎn)餐了
        System.out.println("顧客一:來一份清淡版的魚香肉絲");
        // 廚師長(zhǎng)指揮
        headCooker.direct(cookerA);
        // 上菜
        YuXiangRouSi yuXiangRouSiA = cookerA.Serve();
        // 查看做飯步驟
        yuXiangRouSiA.show();

        System.out.println("**************************************");

        System.out.println("顧客二:來一份爽辣版的魚香肉絲");
        headCooker.direct(cookerB);
        YuXiangRouSi yuXiangRouSiB = cookerB.Serve();
        yuXiangRouSiB.show();

    }
}

運(yùn)行結(jié)果:

image-20200826211119050

個(gè)人思考

在使用建造者模式的時(shí)候,我明顯感覺建造者模式與之前學(xué)過的一種設(shè)計(jì)模式很像淮悼,即模板方法咐低。

模板方法是在抽象類中定義步驟,讓子類去繼承袜腥,關(guān)鍵之處在于相同的方法就在抽象類中實(shí)現(xiàn)见擦,而不相同的方法,就讓其子類各自實(shí)現(xiàn)羹令。相對(duì)而言比較簡(jiǎn)單

建造者模式與鲤屡,模板方法很想,我認(rèn)為它是在模板方法的基礎(chǔ)上增加了一個(gè)Director(指揮者)福侈,這個(gè)Director可以設(shè)置步驟的執(zhí)行順序酒来。

目前也是剛剛接觸建造者模式,對(duì)其理解還比較膚淺肪凛,甚至有些地方理解錯(cuò)誤役首。如果有哪里理解不到位的地方,還請(qǐng)指出显拜。收到后必定會(huì)在第一時(shí)間進(jìn)行改正,本篇博客也會(huì)持續(xù)更新爹袁,有新的理解會(huì)及時(shí)補(bǔ)充

本文純?cè)瓌?chuàng)远荠,寫作不易,如果了幫到您失息,請(qǐng)點(diǎn)贊譬淳、轉(zhuǎn)發(fā)、收藏盹兢!杜絕抄襲邻梆,轉(zhuǎn)載請(qǐng)注明來源!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绎秒,一起剝皮案震驚了整個(gè)濱河市浦妄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖剂娄,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蠢涝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阅懦,警方通過查閱死者的電腦和手機(jī)和二,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耳胎,“玉大人惯吕,你說我怎么就攤上這事∨挛纾” “怎么了废登?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诗轻。 經(jīng)常有香客問我钳宪,道長(zhǎng),這世上最難降的妖魔是什么扳炬? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任吏颖,我火速辦了婚禮,結(jié)果婚禮上恨樟,老公的妹妹穿的比我還像新娘半醉。我一直安慰自己,他們只是感情好劝术,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布缩多。 她就那樣靜靜地躺著,像睡著了一般养晋。 火紅的嫁衣襯著肌膚如雪衬吆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天绳泉,我揣著相機(jī)與錄音逊抡,去河邊找鬼。 笑死零酪,一個(gè)胖子當(dāng)著我的面吹牛冒嫡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播四苇,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼孝凌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了月腋?” 一聲冷哼從身側(cè)響起蟀架,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤瓣赂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辜窑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钩述,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年穆碎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牙勘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡所禀,死狀恐怖方面,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情色徘,我是刑警寧澤恭金,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站褂策,受9級(jí)特大地震影響横腿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斤寂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一耿焊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧遍搞,春花似錦罗侯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诊县,卻和暖如春讲弄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背依痊。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工避除, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抗悍。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钳枕,于是被迫代替她去往敵國(guó)和親缴渊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354