小光熱干面提供飲料了---簡單工廠

cover

前情提要

本意是想像美劇的previously那樣, 不知道怎么翻譯好, 求翻譯達(dá)人賜教...

上集講到, 小光辭了工作, 開起了熱干面的店子, 用Builder模式改造了熱干面的構(gòu)建過程, 是日漸穩(wěn)定有效起來, 生意也是越來越好.

但是小光是善于觀察的同學(xué)啊, 他發(fā)現(xiàn)熱干面真的好干啊(好像一般人也都能發(fā)現(xiàn), 鬼臉~). 心想, 解決用戶痛點(diǎn)才產(chǎn)品的存在根本啊, 是時(shí)候推出新東西了.

于是他決定跟推出自己的光氏飲料產(chǎn)品.

飲料的制作

經(jīng)過一番調(diào)查和走訪, 小光發(fā)現(xiàn)幾個(gè)特點(diǎn):

  • 大家對這個(gè)飲料要求不高(碼農(nóng)的屌絲特性啊) , 解渴為主.
  • 因?yàn)橼s著上班, 一般要求要快, 最好可以直接拿走.
  • 品種要豐富, 大家口味不一啊.

于是, 小光選用了最新的XX牌 (有廣告商找我嗎? 哈哈.) 速溶飲料. 制作飲料的過程很簡單, 很快, 小光做出了第一杯飲料---橙汁:

public class OrangeJuice {

    public void make() {
        // 1. 拿出一次性飲料杯
        System.out.println("拿出一次性飲料杯");

        // 2. 加入速溶橙汁粉
        System.out.println("加入速溶橙汁粉");

        // 3. 加水沖兌
        System.out.println("加水");

        // 4. 加蓋, 打包
        System.out.println("加蓋, 打包");
    }
}

小光的思考

看起來, 程序似乎是可以運(yùn)轉(zhuǎn)了, 讓我們投入生產(chǎn)吧...
然而, 小光何許人啊, 畢竟是在碼農(nóng)界混了好些年的同志啊. 還沒有投入使用, 就發(fā)現(xiàn)了"問題":

飲料有很多種, 過程都類似, 只是放的速溶包不一樣. 如果我每個(gè)都這么寫, 改天真有人找我打廣告, 杯子上印個(gè)二維碼什么的, 我不是每個(gè)飲料的制作過程都要改啊

靈光一現(xiàn), 小光想起了面向?qū)ο笏枷?/strong>中提到的抽象, 封裝, 于是乎, 小光改寫了自己的程序:

他抽象出來一個(gè)"Drink"類:

public abstract class Drink {

    public void make() {
        // 1. 拿出一次性飲料杯
        System.out.println("拿出一次性飲料杯");

        // 2. 加入速溶橙汁粉
        System.out.println("加入" + getInstantPackage());

        // 3. 加水沖兌
        System.out.println("加水");

        // 4. 加蓋, 打包
        System.out.println("加蓋, 打包");
    }

    abstract String getInstantPackage();
}

可樂, 酸梅湯, 橙汁皆繼承了Drink:

public class Coke extends Drink {
    @Override
    String getInstantPackage() {
        return "速溶可樂粉";
    }
}

public class PlumJuice extends Drink {
    @Override
    String getInstantPackage() {
        return "速溶酸梅粉";
    }
}

public class OrangeJuice extends Drink {
    @Override
    String getInstantPackage() {
        return "速溶橙汁粉";
    }
}

開賣

制作完飲料, 準(zhǔn)備開賣了, 是這樣的:

public class XiaoGuang {

    public static void main(String[] args) {

        OrangeJuice orangeJuice = new OrangeJuice();
        orangeJuice.make();
    }
}

第二天, 生意實(shí)在太好, 小光請了表妹臨時(shí)來幫忙泡制飲料. 而且, 小光還發(fā)現(xiàn)自己也無需關(guān)注用戶要什么飲料了, 直接讓用戶告訴表妹, 表妹直接制作飲料給用戶就行~

表妹負(fù)責(zé)根據(jù)用戶要求生產(chǎn)飲料:

public class Cousins {

    public static Drink create(String drinkType) {

        //  Java7開始, switch支持String
        switch (drinkType) {
            case "橙汁":
                return new OrangeJuice();

            case "酸梅湯":
                return new PlumJuice();

            case "可樂":
                return new Coke();

            default:
                return new OrangeJuice();
        }
    }
}

小光不再關(guān)注飲料具體種類:

public class XiaoGuang {

    public static void main(String[] args) {

        Drink drink = Cousins.create("可樂");
        drink.make();
    }
}

加上飲料套餐之后, 生意果然越來越好, 估計(jì)也有美女助陣的加成, 哈哈...

故事之后

可能有些同學(xué)已經(jīng)看出一點(diǎn)熟悉感了, 我們把這些關(guān)系一個(gè)UML表示下:


如此, 應(yīng)該就比較清晰了, 這個(gè)就是我們今天的主題---簡單工廠.

嚴(yán)格來說, 簡單工廠并非一種設(shè)計(jì)模式, 可以說是一種編碼習(xí)慣.

那么我們?yōu)槭裁匆褂?strong>簡單工廠, 或者說這么做有什么好處呢?

從我們這個(gè)例子中, 可以看到, 小光(Client類)不需要去關(guān)注飲料泡制(Drink make)這個(gè)過程了, 有更多的時(shí)間去接待客戶, 只需從表妹(工廠類)那拿到相應(yīng)的飲料給客戶即可.

這個(gè)其實(shí)是蘊(yùn)含了單一職責(zé)的編程思想:

  • 小光的職責(zé)是接待客戶
  • 表妹的職責(zé)是泡制飲料

簡單工廠一般來說, 使用一個(gè)靜態(tài)方法來生產(chǎn)產(chǎn)品, 故而有時(shí)也稱之為靜態(tài)工廠方法模式.

擴(kuò)展閱讀

在這個(gè)故事的過程中, 我們提到了面向?qū)ο蟮?strong>抽象, 封裝特性. 實(shí)際上我們所有的OOD原則, 設(shè)計(jì)模式, 都是基于面向?qū)ο蟮乃枷氲? 離不開抽象, 封裝, 繼承, 多態(tài)幾大特性. 隨著對這些設(shè)計(jì)模式的分析, 也可以讓我們加深面向?qū)ο蟮木幊趟枷?

以Glide為例, 其中的DefaultConnectivityMonitorFactory.java就是一個(gè)類似的簡單工廠實(shí)現(xiàn):

public class DefaultConnectivityMonitorFactory implements ConnectivityMonitorFactory {

  @NonNull
  public ConnectivityMonitor build(
      @NonNull Context context,
      @NonNull ConnectivityMonitor.ConnectivityListener listener) {
    final int res = context.checkCallingOrSelfPermission("android.permission.ACCESS_NETWORK_STATE");
    final boolean hasPermission = res == PackageManager.PERMISSION_GRANTED;
    if (hasPermission) {
      return new DefaultConnectivityMonitor(context, listener);
    } else {
      return new NullConnectivityMonitor();
    }
  }
}

與表妹Cousins(工廠)的實(shí)現(xiàn)很類似, 只是這個(gè)Factory具體創(chuàng)建什么產(chǎn)品不是由傳入的參數(shù)決定的, 是在內(nèi)部的邏輯決定的.

轉(zhuǎn)化為類圖關(guān)系, 更加清晰:

一直在說的話: 所謂架構(gòu), 設(shè)計(jì)模式都是一種思想, 沒有固定的招式, 所有的這些招式都是讓我們?nèi)腴T, 了解面向?qū)ο蟮幕A(chǔ)思想, 然后能運(yùn)用無形. 共勉.

留個(gè)尾子

大家可能有發(fā)現(xiàn), 簡單工廠的弊端也是很多的, 表妹(工廠)的責(zé)任太重, 包含(UML依賴關(guān)系)了所有的具體產(chǎn)品的實(shí)現(xiàn). 另外, 如果需要修改或增加產(chǎn)品, 我們就得改變工廠類的實(shí)現(xiàn). 這顯然違反了開閉原則.

故而, 簡單工廠, 一般來說, 適用于產(chǎn)品類別較少, 且固定的場景.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只锻,一起剝皮案震驚了整個(gè)濱河市悠垛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖晤柄,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拦焚,死亡現(xiàn)場離奇詭異,居然都是意外死亡浑测,警方通過查閱死者的電腦和手機(jī)翅阵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迁央,“玉大人掷匠,你說我怎么就攤上這事♂Γ” “怎么了讹语?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜂科。 經(jīng)常有香客問我顽决,道長,這世上最難降的妖魔是什么导匣? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任才菠,我火速辦了婚禮,結(jié)果婚禮上贡定,老公的妹妹穿的比我還像新娘赋访。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布蚓耽。 她就那樣靜靜地躺著渠牲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪步悠。 梳的紋絲不亂的頭發(fā)上嘱兼,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音贤徒,去河邊找鬼芹壕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛接奈,可吹牛的內(nèi)容都是我干的踢涌。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼序宦,長吁一口氣:“原來是場噩夢啊……” “哼睁壁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起互捌,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤潘明,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后秕噪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钳降,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年腌巾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遂填。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澈蝙,死狀恐怖吓坚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灯荧,我是刑警寧澤礁击,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站逗载,受9級特大地震影響哆窿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撕贞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一更耻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捏膨,春花似錦秧均、人聲如沸食侮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锯七。三九已至,卻和暖如春誉己,著一層夾襖步出監(jiān)牢的瞬間眉尸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工巨双, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留噪猾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓筑累,卻偏偏與公主長得像袱蜡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子慢宗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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