抽象工廠模式_第1頁(yè)
抽象工廠模式_第2頁(yè)
抽象工廠模式_第3頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、學(xué)生姓名 學(xué) 號(hào) 院 系 專 業(yè) 年 級(jí)&九k學(xué)題目:抽象工廠模式張 婧201021077信息科學(xué)與技術(shù)學(xué)院計(jì)算機(jī)應(yīng)用技術(shù)2010 級(jí)抽象工廠模式在軟件系統(tǒng)中,經(jīng)常面臨著“一系列相互依賴的對(duì)象”的創(chuàng)建工作;同時(shí)由 于需求的變化,往往存在著更多系列對(duì)象的創(chuàng)建工作。 如何應(yīng)對(duì)這種變化?如何 繞過常規(guī)的對(duì)象的創(chuàng)建方法(new),提供一種“封裝機(jī)制”來(lái)避免客戶程序和 這種“多系列具體對(duì)象創(chuàng)建工作”的緊耦合?這就要用到抽象工廠模式。抽象工 廠模式是簡(jiǎn)單工廠模式和工廠方法模式的升級(jí)版,它有更大的靈活性,同時(shí)也更加復(fù)雜一些。為了理解抽象工廠,我們考慮這樣一個(gè)實(shí)際例子:如果你想吃飯了,怎么辦自 己做嗎

2、?自己做就相當(dāng)于程序中直接使用 new。當(dāng)然是自己下個(gè)指令,別人來(lái)做 更爽。那就把做飯的任務(wù)交給廚師吧,那么他就是一個(gè)做飯的工廠了,你告訴他 要吃紅燒肉,等會(huì)他就從廚房給你端出來(lái)一盤香噴噴的紅燒肉了,再來(lái)個(gè)清蒸魚吧。下圖1就是這個(gè)問題的模型。會(huì)物1J-11 .!廚師圖1顯然到了這里,你是 Client ,廚師就是工廠,他擁有做紅燒肉的方法, 做清蒸魚的方法,這些方法返回值就是食物抽象。紅燒肉、清蒸魚就是食物的繼 承類,簡(jiǎn)單工廠模式也成型了。簡(jiǎn)單工廠模式結(jié)構(gòu)圖2優(yōu)點(diǎn):允許客戶端相對(duì)獨(dú)立的創(chuàng)建產(chǎn)品的過程, 并且在系統(tǒng)引入新產(chǎn)品的時(shí)候無(wú) 需修改客戶端。缺點(diǎn):對(duì)修改不封閉,新增加產(chǎn)品您要修改工廠。違法

3、了開閉法則(OCP。工廠方法模式生活例子:廚師手藝再好,總有不會(huì)做的菜,你想吃回鍋肉,怎么辦,讓廚師學(xué)唄,于 是就給他新增了做回鍋肉的方法,以后你再想吃一個(gè)新菜,就要給廚師新加一個(gè) 方法,顯然此做法的缺點(diǎn)也就暴露出來(lái)了,用程序設(shè)計(jì)的描述就是對(duì)修改永遠(yuǎn)不 能封閉。面對(duì)上面對(duì)修改不能封閉的問題,有沒有好的解決方案嗎?把廚師抽象變 成一個(gè)基類,你請(qǐng)幾個(gè)具體的廚師,分別有做清蒸魚的,做紅燒肉的廚師,如果 你想吃一個(gè)新菜,就再新找個(gè)廚師,從你的廚師基類繼承一下,讓他來(lái)做這個(gè)新 菜。現(xiàn)在來(lái)看這個(gè)模式發(fā)生了變化,結(jié)構(gòu)中多了一個(gè)廚師的抽象,抽象并不具體 的加工產(chǎn)品了,至于做什么,是由這個(gè)抽象工廠的繼承子類來(lái)實(shí)

4、現(xiàn), 現(xiàn)在的模式 也就變成工廠方法模式了,這個(gè)上面的結(jié)構(gòu)圖 1就變成了下面的圖3的結(jié)構(gòu)了。l».JL詢出I| 工 i L d 1h() 白 Vf現(xiàn)在再來(lái)分析現(xiàn)在的模式,顯然簡(jiǎn)單工廠的缺陷解決了,新增加一個(gè)菜只需要新增加一個(gè)廚師就行了,原來(lái)的廚師還在做原來(lái)的工作,這樣你的設(shè)計(jì)就對(duì) 修改封閉了。工廠方法模式結(jié)構(gòu)FAiTirttAi/Tfoit廠啟* 姑i .?) ,j 優(yōu)點(diǎn):優(yōu)化簡(jiǎn)單工廠模式,做到“開-閉”原則??勺龅桨丫唧w的產(chǎn)品創(chuàng)建過程 延遲到具體的子類工廠。缺點(diǎn):對(duì)于創(chuàng)建不同系列的產(chǎn)品無(wú)能為力。抽象工廠模式生活例子你發(fā)現(xiàn)菜可分成許多菜系,魯菜、粵菜、湘菜等等,它們各有各的風(fēng)味,同 樣

5、是紅燒肉由不同菜系出來(lái)的味道也各不相同。 如果你的廚師都是魯菜風(fēng)味,廣 東的朋友來(lái)了吃不慣,怎么辦?現(xiàn)在我們?cè)倩氐胶?jiǎn)單工廠模式,我們把紅燒肉再向下繼承,生成魯菜紅燒肉、 粵菜紅燒肉、湘菜紅燒肉;清蒸魚向下繼承為魯菜清蒸魚、粵菜清蒸魚、湘菜清 蒸魚。我們也修改一下廚師這個(gè)類,不讓其返回食物基類,而是返回紅燒肉、清 蒸魚、這一層次,并把這些方法抽象化,作為菜系工廠基類,然后再?gòu)拇嘶惱^ 承出,魯菜工廠、粵菜工廠、湘菜工廠等等,再由這些具體工廠實(shí)現(xiàn)創(chuàng)建具體菜 的工作。圖5現(xiàn)在可以看到,想新來(lái)做一個(gè)菜系,只需新聘請(qǐng)一個(gè)廚師就可以了,多么完美,但是你先別高興太早,如果你想新增加一個(gè)菜就變得非常困難了。抽

6、象工廠模式結(jié)構(gòu)抽象工廠模式代碼#in elude <iostream>#in elude <stri ng>using n amespaee std;/紅燒肉class CHon gshaoroupublic:virtual CH on gshaorou() ;/產(chǎn)品使用公共接口virtual void Start() = 0;/抽象基類,純虛函數(shù)由派生類去實(shí)現(xiàn);/魯菜紅燒肉class CHon gshaorouLucai : public CHon gshaoroupublic:CHon gshaorouLucai()cout << "制作魯菜紅

7、燒肉."<< endl;virtual CH on gshaorouLucai() ;virtual void Start()cout << "魯菜紅燒肉好了 ." << endl;/粵菜紅燒肉class CHon gshaorouYuecai : public CHon gshaoroupublic:CHon gshaorouYuecai()cout << "制作粵菜紅燒肉."<< endl;virtual CH on gshaorouYuecai() ;virtual void S

8、tart()cout << "粵菜紅燒肉好了 ." << endl;/清蒸魚class Cqin gzhe ngyupublic:virtual Cq in gzhe ngyu() ;/產(chǎn)品使用公共接口virtual void Start() = 0;/抽象基類,純虛函數(shù)由派生類去實(shí)現(xiàn);/魯菜清蒸魚class Cqin gzhe ngyuLucai : public Cqin gzhe ngyupublic:Cqin gzhe ngyuLucai()cout << "制作魯菜清蒸魚."<< endl;vir

9、tual Cq in gzhe ngyuLucai() ;virtual void Start()cout << "魯菜清蒸魚好了 ." << endl;/粵菜清蒸魚class Cqin gzhe ngyuYuecai : public Cqin gzhe ngyupublic:Cqin gzhe ngyuYuecai()cout << "制作粵菜清蒸魚."<< endl;virtual Cq in gzhe ngyuYuecai() ;virtual void Start()cout << &

10、quot;粵菜清蒸魚好了 ." << endl;;/抽象工廠class CFactorypublic:virtual CFactory();virtual CHon gshaorou* CreateH on gshaorou() = 0;virtual Cqin gzhe ngyu* Createq in gzhe ngyu() = 0;/魯菜工廠class CLucaiFactory : public CFactorypublic:CLucaiFactory()cout << " 制作魯菜工廠."<< endl;virtual

11、 CLucaiFactory();virtual CHon gshaorou* CreateH on gshaorou()retur n new CHon gshaorouLucai;virtual Cqin gzhe ngyu* Createq in gzhe ngyu()retur n new Cqin gzhe ngyuLucai;/粵菜工廠class CYuecaiFactory : public CFactorypublic:CYuecaiFactory()cout << "制作粵菜工廠."<< endl;virtual CYuecaiFa

12、ctory();virtual CHon gshaorou* CreateH on gshaorou()retur n new CHon gshaorouYuecai;virtual Cqin gzhe ngyu* Createq in gzhe ngyu()retur n new Cqin gzhe ngyuYuecai;void Test(CFactory* pFactory)CHon gshaorou* pHon gshaorou = NULL;制作紅燒肉制作清蒸魚Cqin gzhe ngyu* pqin gzhe ngyu = NULL;pHon gshaorou = pFactory

13、->CreateH on gshaorou();/ pqin gzhe ngyu = pFactory->Createq in gzhe ngyu(); pHon gshaorou->Start();pqi ngzhe ngyu->Start();delete pqin gzhe ngyu;delete pHon gshaorou;int main()CFactory* pFactory = NULL;/抽象工廠/魯菜工廠。做紅燒肉,清蒸魚pFactory = new CLucaiFactory;/ 制作魯菜工廠Test(pFactory);delete pFactory;cout«e ndl;/粵菜工廠。做紅燒肉,清蒸魚pFactory= new CYuecaiFactory;/制作粵菜工廠Test(pFactory);delete pFactory;system("pause");return 0;優(yōu)點(diǎn):將客戶端與具體的類分離。一個(gè)產(chǎn)品系列中的多個(gè)對(duì)象被設(shè)計(jì)在一起工作, 能保證客戶端始終只使用一個(gè)產(chǎn)品系列,且有利于更新產(chǎn)品系列。缺點(diǎn):難以支持新品種產(chǎn)品。抽象工廠模式與工廠方法模式的區(qū)別a重點(diǎn)不同。工廠方法模式強(qiáng)調(diào)的是不同的創(chuàng)建者根據(jù)自身需求去生產(chǎn)不同的 具體產(chǎn)品,重點(diǎn)是生產(chǎn)具體產(chǎn)品;而抽象工廠模式則定位為“在不指定

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論