簡(jiǎn)單工廠模式

簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式舆绎,又叫做靜態(tài)工廠方法(Static Factory Method)模式隆敢,但不屬于23種GOF設(shè)計(jì)模式之一考阱。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例勾拉。簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式国裳,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)形入。
外文名 Factory Method Pattern
屬 于 創(chuàng)建型模式

簡(jiǎn)單工廠模式的實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù),動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類(這些產(chǎn)品類繼承自一個(gè)父類或接口)的實(shí)例缝左。
該模式中包含的角色及其職責(zé)
工廠(Creator)角色
簡(jiǎn)單工廠模式的核心亿遂,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類的創(chuàng)建產(chǎn)品類的方法可以被外界直接調(diào)用渺杉,創(chuàng)建所需的產(chǎn)品對(duì)象蛇数。
抽象產(chǎn)品(Product)角色
簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口是越。
具體產(chǎn)品(Concrete Product)角色
是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)耳舅,所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例。

優(yōu)點(diǎn)
工廠類是整個(gè)模式的關(guān)鍵.包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象.通過(guò)使用工廠類,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面擺脫出來(lái),僅僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了倚评。而不必管這些對(duì)象究竟如何創(chuàng)建及如何組織的.明確了各自的職責(zé)和權(quán)利挽放,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化绍赛。
缺點(diǎn)
由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則辑畦,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中吗蚌;它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類纯出,則就需要改變工廠類了蚯妇。
當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí)候,可能會(huì)出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實(shí)例的需求.這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類型的判斷交錯(cuò)在一起暂筝,很難避免模塊功能的蔓延箩言,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利;
這些缺點(diǎn)在工廠方法模式中得到了一定的克服焕襟。

使用場(chǎng)景
工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少陨收;
客戶只知道傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心鸵赖;
由于簡(jiǎn)單工廠很容易違反高內(nèi)聚責(zé)任分配原則务漩,因此一般只在很簡(jiǎn)單的情況下應(yīng)用。

代碼實(shí)現(xiàn):
我們需要一個(gè)產(chǎn)品和一個(gè)工廠它褪。那么我們先來(lái)創(chuàng)建一個(gè)產(chǎn)品饵骨。

public interface Product {
    void name();
}

接下來(lái)我們?cè)趧?chuàng)建幾個(gè)實(shí)現(xiàn)類,這里我們創(chuàng)建一個(gè)產(chǎn)品A和產(chǎn)品B茫打。

產(chǎn)品A

public class ProductA implements Product{

    @Override
    public void name() {
        System.out.println("產(chǎn)品A");
    }

}

產(chǎn)品B

public class ProductB implements Product{

    @Override
    public void name() {
        System.out.println("產(chǎn)品B");      
    }

}

接下來(lái)我們需要一個(gè)工廠類:Factory來(lái)創(chuàng)建產(chǎn)品居触。
我們提供一個(gè)創(chuàng)建產(chǎn)品方法:createProduct
接著我們可以判斷產(chǎn)品類型,并根據(jù)不同類型來(lái)創(chuàng)建不同產(chǎn)品老赤。

public class Factory {
    public static Product createProduct(char type) {
        switch (type) {
        case 'a':
            return new ProductA();
        case 'b':
            return new ProductB();
        default:
            return null;
        }       
    }
}

以上是簡(jiǎn)單的簡(jiǎn)單工廠的實(shí)現(xiàn)轮洋。在介紹中也說(shuō)過(guò),但這種實(shí)現(xiàn)違背了設(shè)計(jì)模式的開閉原則抬旺。原因是在我們?cè)黾赢a(chǎn)品類的時(shí)候就不得不改動(dòng)工廠類了弊予。
我們可以用反射來(lái)彌補(bǔ)這點(diǎn)的不足。

我們修改工廠類:

public class Factory {
    public static Product createProduct(Class<? extends Product> clz)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        return (Product) Class.forName(clz.getName()).newInstance();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚷狞,一起剝皮案震驚了整個(gè)濱河市块促,隨后出現(xiàn)的幾起案子荣堰,更是在濱河造成了極大的恐慌床未,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件振坚,死亡現(xiàn)場(chǎng)離奇詭異薇搁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)渡八,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人弥雹,你說(shuō)我怎么就攤上這事兄纺。” “怎么了残腌?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我粮宛,道長(zhǎng),這世上最難降的妖魔是什么卖宠? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任巍杈,我火速辦了婚禮,結(jié)果婚禮上扛伍,老公的妹妹穿的比我還像新娘筷畦。我一直安慰自己,他們只是感情好刺洒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布鳖宾。 她就那樣靜靜地躺著,像睡著了一般作媚。 火紅的嫁衣襯著肌膚如雪攘滩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天纸泡,我揣著相機(jī)與錄音漂问,去河邊找鬼。 笑死女揭,一個(gè)胖子當(dāng)著我的面吹牛蚤假,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吧兔,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼磷仰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了境蔼?” 一聲冷哼從身側(cè)響起灶平,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎箍土,沒(méi)想到半個(gè)月后逢享,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吴藻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年瞒爬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侧但,死狀恐怖矢空,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禀横,我是刑警寧澤屁药,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站柏锄,受9級(jí)特大地震影響者祖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绢彤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一七问、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茫舶,春花似錦械巡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至疹启,卻和暖如春古程,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喊崖。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工挣磨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荤懂。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓茁裙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親节仿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晤锥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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