★03.創(chuàng)建型模式 ★03.Factory Method(工廠方法)

意圖

為父類(lèi)聲明一個(gè)創(chuàng)建對(duì)象的方法(工廠方法)君旦,讓子類(lèi)決定創(chuàng)建哪一個(gè)類(lèi)的對(duì)象敌卓。

別名

虛構(gòu)造器(Virtual Constructor)

動(dòng)機(jī)

背景

有兩個(gè)類(lèi)千绪,Application和Document池摧,Application可以創(chuàng)建Document荔泳。

問(wèn)題

特定Application子類(lèi)創(chuàng)建特定Document子類(lèi)橙数,但是Application不知道需要?jiǎng)?chuàng)建哪個(gè)Document子類(lèi)對(duì)象尊流,所以給Application一個(gè)工廠方法(虛函數(shù))來(lái)創(chuàng)建Document子類(lèi)對(duì)象,讓Application的子類(lèi)來(lái)決定要?jiǎng)?chuàng)建哪個(gè)Document子類(lèi)的對(duì)象灯帮。

示例圖形

適用性

  1. 當(dāng)一個(gè)類(lèi)不知道它所創(chuàng)建的對(duì)象的類(lèi)是什么崖技,或如何創(chuàng)建的時(shí)候。
  2. 當(dāng)一個(gè)類(lèi)希望由它的子類(lèi)來(lái)指定它所創(chuàng)建的對(duì)象的時(shí)候钟哥。

結(jié)構(gòu)

參與者

  1. Product:工廠方法所要?jiǎng)?chuàng)建的產(chǎn)品的抽象類(lèi)迎献。
  2. ConcreteProduct:Product的具體子類(lèi)。
  3. Creator:聲明工廠方法(可為抽象方法)腻贰,該方法返回一個(gè)Product對(duì)象吁恍。
  4. ConcteteCreator:重定義工廠方法來(lái)返回ConcreteProduct實(shí)例。

協(xié)作

Creator將創(chuàng)建ConcreteProduct實(shí)例的任務(wù)延遲到ConcteteCreator。

效果

  1. 潛在缺點(diǎn):客戶可能僅僅為了創(chuàng)建一個(gè)特定的ConcreteProduct冀瓦,而不得不先創(chuàng)建一個(gè)ConcteteCreator伴奥。
  2. 用工廠方法在一個(gè)類(lèi)的內(nèi)部創(chuàng)建對(duì)象通常比直接創(chuàng)建對(duì)象更靈活。
  3. 連接平行的類(lèi)層次翼闽,如圖:


實(shí)現(xiàn)

  1. Factory Method模式有兩種情況:
    • Creator工廠方法只提供聲明而不提供實(shí)現(xiàn)拾徙。
    • Creator中的工廠方法提供默認(rèn)實(shí)現(xiàn)。
  2. 參數(shù)化工廠方法:
    • 工廠方法接受一個(gè)參數(shù)肄程,通過(guò)參數(shù)得知要?jiǎng)?chuàng)建的Product類(lèi)型。
    • 子類(lèi)可以重定義該工廠方法选浑,預(yù)先處理部分子類(lèi)感興趣的參數(shù)對(duì)象蓝厌,將其他參數(shù)對(duì)象延遲給父類(lèi)處理。
  3. 在C++中古徒,注意在Creator的構(gòu)造函數(shù)中不要調(diào)用工廠方法拓提,因?yàn)榇藭r(shí)工廠方法還沒(méi)表現(xiàn)出虛函數(shù)性質(zhì)。(詳細(xì)見(jiàn)C++單繼承相關(guān)筆記:在構(gòu)造或析構(gòu)基類(lèi)時(shí)隧膘,如果調(diào)用了某個(gè)虛函數(shù)代态,則這個(gè)虛函數(shù)使用與當(dāng)前構(gòu)造函數(shù)或析構(gòu)函數(shù)所屬類(lèi)型相對(duì)應(yīng)的虛函數(shù)版本)
  4. 可以配合Lazy Initialization使用來(lái)達(dá)到優(yōu)化性能和避免上述問(wèn)題的目的:


  5. 可以為Creator提供一個(gè)模板子類(lèi)StandardCreator,通過(guò)傳入ConcreteProduct從而避免創(chuàng)建Creator子類(lèi)疹吃。
  6. 命名約定:使用命名約定讓別人知道你在使用工廠方法蹦疑。如MacApp中,工廠方法的形式:Class * DoMakeClass()萨驶。
  7. 相關(guān)模式:
    • (3.1)Abstract Factory經(jīng)常用Factory Method來(lái)實(shí)現(xiàn)歉摧。
    • (5.10)Template Methods通常調(diào)用Factory Method。
    • (3.4)Ptototype不需要?jiǎng)?chuàng)建Cteator的子類(lèi)腔呜,但是它們通常要一個(gè)針對(duì)Product類(lèi)的Initialize操作叁温。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市核畴,隨后出現(xiàn)的幾起案子膝但,更是在濱河造成了極大的恐慌,老刑警劉巖谤草,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跟束,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡丑孩,警方通過(guò)查閱死者的電腦和手機(jī)泳炉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嚎杨,“玉大人花鹅,你說(shuō)我怎么就攤上這事》阏悖” “怎么了刨肃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵古拴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我真友,道長(zhǎng)黄痪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任盔然,我火速辦了婚禮桅打,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愈案。我一直安慰自己挺尾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布站绪。 她就那樣靜靜地躺著遭铺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恢准。 梳的紋絲不亂的頭發(fā)上魂挂,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音馁筐,去河邊找鬼涂召。 笑死,一個(gè)胖子當(dāng)著我的面吹牛敏沉,可吹牛的內(nèi)容都是我干的芹扭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赦抖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舱卡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起队萤,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轮锥,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后要尔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舍杜,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年赵辕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了既绩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡还惠,死狀恐怖饲握,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤救欧,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布衰粹,位于F島的核電站,受9級(jí)特大地震影響笆怠,放射性物質(zhì)發(fā)生泄漏铝耻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一蹬刷、第九天 我趴在偏房一處隱蔽的房頂上張望瓢捉。 院中可真熱鬧,春花似錦办成、人聲如沸泡态。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兽赁。三九已至状答,卻和暖如春冷守,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惊科。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工拍摇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馆截。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓充活,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蜡娶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子混卵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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