Java設(shè)計(jì)模式——工廠模式

定義:

工廠模式是 Java 中最常用的設(shè)計(jì)模式之一炼蛤。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式本刽。

工廠模式主要是為創(chuàng)建對(duì)象提供過(guò)渡接口鲸湃,以便將創(chuàng)建對(duì)象的具體過(guò)程屏蔽隔離起來(lái),達(dá)到提高靈活性的目的子寓。

工廠模式根據(jù)抽象程度的不同分為三種:

  1. 簡(jiǎn)單工廠模式(也叫靜態(tài)工廠模式)
  2. 工廠方法模式(也叫多形性工廠)
  3. 抽象工廠模式(也叫工具箱)

簡(jiǎn)單工廠模式

實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù)暗挑,動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類(這些產(chǎn)品類繼承自一個(gè)父類或接口)的實(shí)例。簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)斜友,所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例炸裆。

工廠方法模式

工廠方法是粒度很小的設(shè)計(jì)模式,因?yàn)槟J降谋憩F(xiàn)只是一個(gè)抽象的方法鲜屏。 提前定義用于創(chuàng)建對(duì)象的接口烹看,讓子類決定實(shí)例化具體的某一個(gè)類国拇,即在工廠和產(chǎn)品中間增加接口,工廠不再負(fù)責(zé)產(chǎn)品的創(chuàng)建惯殊,由接口針對(duì)不同條件返回具體的類實(shí)例酱吝,由具體類實(shí)例去實(shí)現(xiàn)。

抽象工廠模式

當(dāng)有多個(gè)抽象角色時(shí)使用的一種工廠模式土思。抽象工廠模式可以向客戶端提供一個(gè)接口务热,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個(gè)產(chǎn)品對(duì)象己儒。它有多個(gè)抽象產(chǎn)品類崎岂,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類,一個(gè)抽象工廠類闪湾,可以派生出多個(gè)具體工廠類冲甘,每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。

工廠方法模式應(yīng)該在實(shí)際中用的較多途样,我們以工廠方法模式舉例

抽象的產(chǎn)品類:定義car 交通工具類

public interface Car {    
    void gotowork();
}

定義實(shí)際的產(chǎn)品類江醇,總共定義兩個(gè),bike 和bus 分別表示不同的交通工具類

public class Bike implements Car {
@Override
public void gotowork() {
System.out.println("騎自行車去上班娘纷!");
}
}

public class Bus implements Car {
@Override
public void gotowork() {
System.out.println("坐公交車去上班嫁审!");
}
}

定義抽象的工廠接口

public interface ICarFactory {
Car getCar();
}

具體的工廠子類,分別為每個(gè)具體的產(chǎn)品類創(chuàng)建不同的工廠子類

public class BikeFactory implements ICarFactory {
@Override
public Car getCar() {
return new Bike();
}
}

public class BusFactory implements ICarFactory {
@Override
public Car getCar() {
return new Bus();
}
}

簡(jiǎn)單的測(cè)試類赖晶,來(lái)驗(yàn)證不同的工廠能夠產(chǎn)生不同的產(chǎn)品對(duì)象

public class TestFactory {
@Test
public void test() {
ICarFactory factory = null;
// bike
factory = new BikeFactory();
Car bike = factory.getCar();
bike.gotowork();

    // bus
    factory = new BusFactory();
    Car bus = factory.getCar();
    bus.gotowork();
}

}

工廠模式的優(yōu)點(diǎn):

    1律适、一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象,只要知道其名稱就可以了遏插,降低了耦合度捂贿。

    2、擴(kuò)展性高胳嘲,如果想增加一個(gè)產(chǎn)品厂僧,只要擴(kuò)展一個(gè)工廠類就可以。使得代碼結(jié)構(gòu)更加清晰了牛。

    3颜屠、屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口鹰祸。

工廠模式的缺點(diǎn):

    每次增加一個(gè)產(chǎn)品時(shí)甫窟,都需要增加一個(gè)具體類和對(duì)象實(shí)現(xiàn)工廠(這里可以使用反射機(jī)制來(lái)避免),使得系統(tǒng)中類的個(gè)數(shù)成倍增加蛙婴,在一定程度上增加了系統(tǒng)的復(fù)雜度粗井,同時(shí)也增加了系統(tǒng)具體類的依賴。所以對(duì)于簡(jiǎn)單對(duì)象來(lái)說(shuō),使用工廠模式反而增加了復(fù)雜度浇衬。

工廠模式的適用場(chǎng)景:

    1懒构,  一個(gè)對(duì)象擁有很多子類。

    2耘擂,  創(chuàng)建某個(gè)對(duì)象時(shí)需要進(jìn)行許多額外的操作胆剧。

    3,  系統(tǒng)后期需要經(jīng)常擴(kuò)展梳星,它把對(duì)象實(shí)例化的任務(wù)交由實(shí)現(xiàn)類完成赞赖,擴(kuò)展性好。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冤灾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辕近,更是在濱河造成了極大的恐慌韵吨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件移宅,死亡現(xiàn)場(chǎng)離奇詭異归粉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)漏峰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)糠悼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人浅乔,你說(shuō)我怎么就攤上這事倔喂。” “怎么了靖苇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵席噩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我贤壁,道長(zhǎng)悼枢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任脾拆,我火速辦了婚禮馒索,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘名船。我一直安慰自己绰上,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布包帚。 她就那樣靜靜地躺著渔期,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疯趟,一...
    開(kāi)封第一講書(shū)人閱讀 49,879評(píng)論 1 290
  • 那天拘哨,我揣著相機(jī)與錄音,去河邊找鬼信峻。 笑死倦青,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盹舞。 我是一名探鬼主播产镐,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踢步!你這毒婦竟也來(lái)了癣亚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤获印,失蹤者是張志新(化名)和其女友劉穎述雾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體兼丰,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玻孟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鳍征。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黍翎。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖艳丛,靈堂內(nèi)的尸體忽然破棺而出匣掸,到底是詐尸還是另有隱情,我是刑警寧澤质礼,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布旺聚,位于F島的核電站,受9級(jí)特大地震影響眶蕉,放射性物質(zhì)發(fā)生泄漏砰粹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一造挽、第九天 我趴在偏房一處隱蔽的房頂上張望碱璃。 院中可真熱鬧,春花似錦饭入、人聲如沸嵌器。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爽航。三九已至蚓让,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間讥珍,已是汗流浹背历极。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衷佃,地道東北人趟卸。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像氏义,于是被迫代替她去往敵國(guó)和親锄列。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

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

  • 工廠模式是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常使用的設(shè)計(jì)模式惯悠。當(dāng)我們需要?jiǎng)?chuàng)建一些比較負(fù)責(zé)的對(duì)象的時(shí)候邻邮,為了將對(duì)象的初始化部分進(jìn)行隔離...
    MrKing5946閱讀 358評(píng)論 0 0
  • 一、工廠模式簡(jiǎn)介 意圖定義一個(gè)創(chuàng)建對(duì)象的接口克婶,讓其子類自己決定實(shí)例化哪一個(gè)工廠類饶囚,工廠模式使其創(chuàng)建過(guò)程延遲到子類進(jìn)...
    怡紅快綠閱讀 596評(píng)論 0 0
  • 一、工廠模式主要是為創(chuàng)建對(duì)象提供過(guò)渡接口鸠补,以便將創(chuàng)建對(duì)象的具體過(guò)程屏蔽隔離起來(lái),達(dá)到提高靈活性的目的嘀掸。 工廠模式在...
    李序鍇閱讀 556評(píng)論 0 0
  • 在java中紫岩,通常使用new操作符創(chuàng)建對(duì)象的實(shí)例。但是在一些情況下睬塌,new操作符直接生成對(duì)象會(huì)帶來(lái)一些問(wèn)題泉蝌,例如:...
    步積閱讀 862評(píng)論 2 3
  • 《蟋蟀比螞蟻有錢(qián)勋陪?》這本書(shū)主要講的是儲(chǔ)蓄。儲(chǔ)蓄是一個(gè)很容易被忽略的事情硫兰。我的原生家庭中诅愚,父母對(duì)于儲(chǔ)蓄這塊不是很關(guān)注...
    快快媽媽育兒說(shuō)閱讀 211評(píng)論 0 0