Java 簡單工廠模式(Simple Factory Pattern)又叫靜態(tài)工廠方法模式(Static FactoryMethod Pattern)

簡單工廠模式解釋:

簡單工廠模式(Simple Factory Pattern)屬于類的創(chuàng)新型模式蚤氏,又叫靜態(tài)工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例呛每,被創(chuàng)建的實(shí)例通常都具有共同的父類昧绣。

簡單工廠模式的角色分布以及各角色的職責(zé):

工廠角色(Creator):這是簡單工廠模式的核心,由它負(fù)責(zé)創(chuàng)建所有的類的內(nèi)部邏輯。當(dāng)然工廠類必須能夠被外界調(diào)用,創(chuàng)建所需要的產(chǎn)品對象。(這個(gè)其實(shí)就是一個(gè)普通類无午,里面提供一個(gè)創(chuàng)建其他類的方法)

抽象(Product)產(chǎn)品角色:簡單工廠模式所創(chuàng)建的所有對象的父類,注意祝谚,這里的父類可以是接口也可以是抽象類宪迟,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。(說一大堆交惯,其實(shí)就是具體產(chǎn)品的父類)

具體產(chǎn)品(Concrete Product)角色:簡單工廠所創(chuàng)建的具體實(shí)例對象次泽,這些具體的產(chǎn)品往往都擁有共同的父類。(其實(shí)就是子類)

看看具體代碼就知道了:

1 抽象產(chǎn)品角色(即父類)

packagecom.diermeng.designPattern.SimpleFactory;

/*

* 產(chǎn)品的抽象接口

*/

public?interfaceFood {

/*

* 獲得相應(yīng)的食物

*/

public?voidget();

}

2 具體產(chǎn)品(即子類)

接下來建立具體的產(chǎn)品:麥香雞和薯?xiàng)l

packagecom.diermeng.designPattern.SimpleFactory.impl;

importcom.diermeng.designPattern.SimpleFactory.Food;

/*

* 麥香雞對抽象產(chǎn)品接口的實(shí)現(xiàn)

*/

public?classMcChickenimplementsFood{

/*

* 獲取一份麥香雞

*/

public?voidget(){

System.out.println("我要一份麥香雞");

}

}

packagecom.diermeng.designPattern.SimpleFactory.impl;

importcom.diermeng.designPattern.SimpleFactory.Food;

/*

* 薯?xiàng)l對抽象產(chǎn)品接口的實(shí)現(xiàn)

*/

public?classChipsimplementsFood{

/*

* 獲取一份薯?xiàng)l

*/

public?voidget(){

System.out.println("我要一份薯?xiàng)l");

}

}

3 工廠角色(即普通類提供了創(chuàng)建其他類的方法)

現(xiàn)在建立一個(gè)食物加工工廠:

packagecom.diermeng.designPattern.SimpleFactory.impl;

importcom.diermeng.designPattern.SimpleFactory.Food;

public?classFoodFactory {

public?staticFood getFood(String type)throwsInstantiationException, IllegalAccessException, ClassNotFoundException {

if(type.equalsIgnoreCase("mcchicken")) {

returnMcChicken.class.newInstance();

}else?if(type.equalsIgnoreCase("chips")) {

returnChips.class.newInstance();

}else{

System.out.println("哎呀席爽!找不到相應(yīng)的實(shí)例化類啦意荤!");

return?null;

}

}

}

4,用法

最后我們建立測試客戶端:

packagecom.diermeng.designPattern.SimpleFactory.client;

importcom.diermeng.designPattern.SimpleFactory.Food;

importcom.diermeng.designPattern.SimpleFactory.impl.FoodFactory;

/*

* 測試客戶端

*/

public?classSimpleFactoryTest {

public?static?voidmain(String[] args)throwsInstantiationException, IllegalAccessException, ClassNotFoundException {

//實(shí)例化各種食物

Food mcChicken = FoodFactory.getFood("McChicken");

Food chips = FoodFactory.getFood("Chips");

Food eggs = FoodFactory.getFood("Eggs");

//獲取食物

if(mcChicken!=null){

mcChicken.get();

}

if(chips!=null){

chips.get();

}

if(eggs!=null){

eggs.get();

}

}

}

簡單工廠模式的優(yōu)缺點(diǎn)分析:

優(yōu)點(diǎn):工廠類是整個(gè)模式的關(guān)鍵所在只锻。它包含必要的判斷邏輯玖像,能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對象齐饮。用戶在使用時(shí)可以直接根據(jù)工廠類去創(chuàng)建所需的實(shí)例御铃,而無需了解這些對象是如何創(chuàng)建以及如何組織的。有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化沈矿。

缺點(diǎn):由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,這就直接導(dǎo)致一旦這個(gè)工廠出了問題咬腋,所有的客戶端都會受到牽連羹膳;而且由于簡單工廠模式的產(chǎn)品室基于一個(gè)共同的抽象類或者接口,這樣一來根竿,但產(chǎn)品的種類增加的時(shí)候陵像,即有不同的產(chǎn)品接口或者抽象類的時(shí)候,工廠類就需要判斷何時(shí)創(chuàng)建何種種類的產(chǎn)品寇壳,這就和創(chuàng)建何種種類產(chǎn)品的產(chǎn)品相互混淆在了一起醒颖,違背了單一職責(zé),導(dǎo)致系統(tǒng)喪失靈活性和可維護(hù)性壳炎。而且更重要的是泞歉,簡單工廠模式違背了“開放封閉原則”,就是違背了“系統(tǒng)對擴(kuò)展開放,對修改關(guān)閉”的原則腰耙,因?yàn)楫?dāng)我新增加一個(gè)產(chǎn)品的時(shí)候必須修改工廠類榛丢,相應(yīng)的工廠類就需要重新編譯一遍。

總結(jié)一下:簡單工廠模式分離產(chǎn)品的創(chuàng)建者和消費(fèi)者挺庞,有利于軟件系統(tǒng)結(jié)構(gòu)的優(yōu)化晰赞;但是由于一切邏輯都集中在一個(gè)工廠類中,導(dǎo)致了沒有很高的內(nèi)聚性选侨,同時(shí)也違背了“開放封閉原則”掖鱼。另外,簡單工廠模式的方法一般都是靜態(tài)的援制,而靜態(tài)工廠方法是無法讓子類繼承的戏挡,因此,簡單工廠模式無法形成基于基類的繼承樹結(jié)構(gòu)隘谣。

uml圖片

在實(shí)際的的使用中增拥,抽閑產(chǎn)品和具體產(chǎn)品之間往往是多層次的產(chǎn)品結(jié)構(gòu),如下圖所示:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寻歧,一起剝皮案震驚了整個(gè)濱河市掌栅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌码泛,老刑警劉巖猾封,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異噪珊,居然都是意外死亡晌缘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門痢站,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磷箕,“玉大人,你說我怎么就攤上這事阵难≡兰希” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵呜叫,是天一觀的道長空繁。 經(jīng)常有香客問我,道長朱庆,這世上最難降的妖魔是什么盛泡? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮娱颊,結(jié)果婚禮上傲诵,老公的妹妹穿的比我還像新娘凯砍。我一直安慰自己,他們只是感情好掰吕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布果覆。 她就那樣靜靜地躺著,像睡著了一般殖熟。 火紅的嫁衣襯著肌膚如雪局待。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天菱属,我揣著相機(jī)與錄音钳榨,去河邊找鬼。 笑死纽门,一個(gè)胖子當(dāng)著我的面吹牛薛耻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赏陵,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饼齿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝙搔?” 一聲冷哼從身側(cè)響起缕溉,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吃型,沒想到半個(gè)月后证鸥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勤晚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年枉层,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赐写。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸟蜡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挺邀,到底是詐尸還是另有隱情揉忘,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布悠夯,位于F島的核電站,受9級特大地震影響躺坟,放射性物質(zhì)發(fā)生泄漏沦补。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一咪橙、第九天 我趴在偏房一處隱蔽的房頂上張望夕膀。 院中可真熱鬧虚倒,春花似錦、人聲如沸产舞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽易猫。三九已至耻煤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間准颓,已是汗流浹背哈蝇。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攘已,地道東北人炮赦。 一個(gè)月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像样勃,于是被迫代替她去往敵國和親吠勘。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

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