工廠模式及其拓展

工廠模式UML圖

閑言

最近鄙人在看《設計模式之禪》這本書峰搪,鞏固一下常用的設計模式届案,本文的例子就直接用的書中的例子,因為作者寫的通俗易懂罢艾,讓我看的欲罷不能楣颠,給作者大大比心!8莉恰(其實我就是懶)
工廠模式的優(yōu)點自不必說童漩,首先,良好的封裝性春锋,在使用的時候我們不必考慮對象創(chuàng)建的各種約束條件矫膨,只需要知道要生產的產品的類名就可以了。其次期奔,優(yōu)秀的可拓展性侧馅,如果業(yè)務有變化,需要增加或者刪除一個產品類呐萌,只需要修改工廠類就可以了馁痴,做到了真正的擁抱變化。最后肺孤,工廠模式是典型的解耦框架罗晕,符合迪米特法則,也符合依賴倒置的原則赠堵。

1.工廠模式定義

工廠模式在我們日常開發(fā)中式使用頻率非常高的一種設計模式小渊,其定義為:定義一個用于創(chuàng)建對象的接口,讓子類決定創(chuàng)建那個類茫叭,該模式使一個類的實例化延遲到其子類酬屉。

也就是說我們創(chuàng)建一個接口,用這個接口去生產具體的類揍愁,不用關心類是怎么創(chuàng)建的呐萨,如何初始化,只須關心要生產的是具體哪一個類吗垮,至于如何創(chuàng)建垛吗,我們去交給工廠來實現(xiàn)。

2.通用實現(xiàn)

以上圖女媧造人為例烁登,我們現(xiàn)在要生產出具體膚色的人怯屉,先創(chuàng)建一個接口AbstractHumanFactory,用于規(guī)定工廠中創(chuàng)建人類的方法饵沧,再創(chuàng)建一個人類的接口锨络,里面規(guī)定了無論那種膚色的人都有的方法,膚色和語言狼牺,方法的具體實現(xiàn)由下面具體膚色的人來實現(xiàn)羡儿。下面上代碼:

//抽象工廠類
public abstract class AbsFactory {
    public abstract <T extends Human>T createHuman(Class<T> cls);
}

//人類接口
interface Human {
    void getColor();
    void talk();
}

//工廠類
public class FactoryImpl extends AbsFactory{
    @Override
    public <T extends Human> T createHuman(Class<T> cls) {
        Human human=null;

        try {
            human=(T)Class.forName(cls.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("創(chuàng)建人類失敗");
        }
        return (T)human;
    }
}

//黑人
public class BlackHuman implements Human{
    @Override
    public void getColor() {
        System.out.println("我是黑種人,我的皮膚是黑色的是钥。");
    }

    @Override
    public void talk() {
        System.out.println("一般人聽不懂黑人在說什么掠归。");
    }
}

//黃種人
public class YellowHuman implements Human{
    @Override
    public void getColor() {
        System.out.println("我是黃種人缅叠,我的皮膚是黃色的。");
    }

    @Override
    public void talk() {
        System.out.println("我們黃種人說的一般都是雙字節(jié)");
    }
}

//白人
public class WhiteHuman implements Human{
    @Override
    public void getColor() {
        System.out.println("我是白種人虏冻,我的皮膚是白色的肤粱。");
    }

    @Override
    public void talk() {
        System.out.println("白種人說的一般都是單字節(jié)。");
    }
}

下面是場景類厨相,也就是我們的使用場景:

public class NvWa {
    public static void main(String[] args) {
        AbsFactory factory=new FactoryImpl();
        Human white=factory.createHuman(WhiteHuman.class);
        white.getColor();
        white.talk();

        Human yellow=factory.createHuman(YellowHuman.class);
        yellow.getColor();
        yellow.talk();

        Human black=factory.createHuman(BlackHuman.class);
        black.getColor();
        black.talk();

    }
}

運行結果:
我是白種人领曼,我的皮膚是白色的。
白種人說的一般都是單字節(jié)蛮穿。
我是黃種人庶骄,我的皮膚是黃色的。
我們黃種人說的一般都是雙字節(jié)
我是黑種人践磅,我的皮膚是黑色的单刁。
一般人聽不懂黑人在說什么。

Process finished with exit code 0

以上就是工廠模式的通用實現(xiàn)音诈。

3.簡單工廠模式
簡單工廠示UML圖

在類圖中幻碱,我們把AbsstractHumanFactory刪除,同時把HumanFactory中的createHuman方法修改成靜態(tài)方法细溅,而在我們的場景類NvWa中也要做相應修改褥傍。

//工廠類
public class FactoryImpl{
    public static <T extends Human> T createHuman(Class<T> cls) {
        Human human=null;

        try {
            human=(T)Class.forName(cls.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("創(chuàng)建人類失敗");
        }
        return (T)human;
    }
}

//場景類
public class NvWa {
    public static void main(String[] args) {
        Human white=FactoryImpl.createHuman(WhiteHuman.class);
        white.getColor();
        white.talk();

        Human yellow=FactoryImpl.createHuman(YellowHuman.class);
        yellow.getColor();
        yellow.talk();

        Human black=FactoryImpl.createHuman(BlackHuman.class);
        black.getColor();
        black.talk();

    }
}

運行結果:
我是白種人,我的皮膚是白色的喇聊。
白種人說的一般都是單字節(jié)恍风。
我是黃種人,我的皮膚是黃色的誓篱。
我們黃種人說的一般都是雙字節(jié)
我是黑種人朋贬,我的皮膚是黑色的。
一般人聽不懂黑人在說什么窜骄。

簡單工廠的應用場景:當一個模塊只需要一個工廠類锦募,沒有必要把他生產出來,使用靜態(tài)方法就可以了邻遏。

這句話是書上的原話糠亩,其實我是沒怎么看懂,但是后來看到后面還有多工廠模式准验,我就明白了赎线。有時候,業(yè)務比較復雜糊饱,很多產品的創(chuàng)建方式垂寥,對對象的屬性值得初始化都不相同,如果都放到一個工廠中去,會使代碼結構不清晰滞项,所以我們?yōu)槊恳粋€產品(或創(chuàng)建方式一致的一類產品)都定義一個工廠狭归,于是,多工廠模式誕生了蓖扑。如果業(yè)務邏輯比較簡單的時候唉铜,一個工廠就可以搞定所有產品的生產的時候,我們就用簡單工廠模式律杠。下面我們來學習一下工廠模式的另一個變種。

4.多工廠模式

多工廠模式UML圖

我們在AbstractHumanFactory中的抽象方法中去掉了傳參竞惋,因為每一個具體的工廠的職責都非常明確柜去,創(chuàng)建自己負責的產品類對象。女媧類也需要做相應修改拆宛。

public abstract class AbsFactory {
    public abstract <T extends Human>T createHuman();
}

public class BlackHumanFactory extends AbsFactory{
    @Override
    public Human createHuman() {
        return new BlackHuman();
    }
}

public class WhiteHumanFactory extends AbsFactory{
    @Override
    public Human createHuman() {
        return new WhiteHuman();
    }
}

public class YellowHumanFactory extends AbsFactory{
    @Override
    public Human createHuman() {
        return new YellowHuman();
    }
}

public class NvWa {
    public static void main(String[] args) {
        Human white=(new WhiteHumanFactory()).createHuman();
        white.getColor();
        white.talk();

        Human yellow=(new YellowHumanFactory()).createHuman();
        yellow.getColor();
        yellow.talk();

        Human black=(new BlackHumanFactory()).createHuman();
        black.getColor();
        black.talk();

    }
}

運行結果和上面一樣嗓奢,這里不再展示。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末浑厚,一起剝皮案震驚了整個濱河市股耽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钳幅,老刑警劉巖物蝙,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敢艰,居然都是意外死亡诬乞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門钠导,熙熙樓的掌柜王于貴愁眉苦臉地迎上來震嫉,“玉大人,你說我怎么就攤上這事牡属∑倍拢” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵逮栅,是天一觀的道長悴势。 經常有香客問我,道長证芭,這世上最難降的妖魔是什么瞳浦? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮废士,結果婚禮上叫潦,老公的妹妹穿的比我還像新娘。我一直安慰自己官硝,他們只是感情好矗蕊,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布短蜕。 她就那樣靜靜地躺著,像睡著了一般傻咖。 火紅的嫁衣襯著肌膚如雪朋魔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天卿操,我揣著相機與錄音警检,去河邊找鬼。 笑死害淤,一個胖子當著我的面吹牛扇雕,可吹牛的內容都是我干的。 我是一名探鬼主播窥摄,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镶奉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了崭放?” 一聲冷哼從身側響起哨苛,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎币砂,沒想到半個月后建峭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡道伟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年迹缀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜徽。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祝懂,死狀恐怖,靈堂內的尸體忽然破棺而出拘鞋,到底是詐尸還是另有隱情砚蓬,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布盆色,位于F島的核電站灰蛙,受9級特大地震影響,放射性物質發(fā)生泄漏隔躲。R本人自食惡果不足惜摩梧,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宣旱。 院中可真熱鬧仅父,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至省容,卻和暖如春抖拴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腥椒。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工阿宅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寞酿。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓家夺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伐弹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容

  • 工廠模式的定義 工廠模式使用的頻率非常高榨为,我們在開發(fā)中總能見到它們的身影惨好。其定義為:Define an inter...
    WILL_HUNTING閱讀 515評論 0 0
  • 工廠方法模式通過引入工廠等級結構,解決了簡單工廠模式中工廠類職責太重的問題随闺,但由于工廠方法模式中的每個工廠只生產一...
    justCode_閱讀 1,198評論 1 6
  • 今天終于讀完了《程序員的自我修養(yǎng)》這本書日川,受到作者的啟發(fā),開通了博客矩乐,準備今后寫一寫讀書的心得龄句,技術上的感...
    YdSean閱讀 165評論 0 0
  • 干貨:關于估值方法以及思考框架的詳細解析 2017-02-15慧博投研資訊 AA 估值方法 一、企業(yè)的商業(yè)模式決定...
    后80閱讀 462評論 0 7
  • 文/楚漢 看多了風景散罕,浮躁的內心總會懷著忐忑的矛盾分歇,輾轉反側,渾然入睡后醒來又重復著昨日的故事欧漱。有故事的人就會懷揣...
    作家壹時光閱讀 260評論 0 1