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

下載本文檔

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

文檔簡介

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

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

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

4、多了一個(gè)廚師的抽象,抽象并不具體的加工產(chǎn)品了,至于做什么,是由這個(gè)抽象工廠的繼承子類來實(shí)現(xiàn),現(xiàn)在的模式也就變成工廠方法模式了,這個(gè)上面的結(jié)構(gòu)圖1就變成了下面的圖3的結(jié)構(gòu)了。 圖3    現(xiàn)在再來分析現(xiàn)在的模式,顯然簡單工廠的缺陷解決了,新增加一個(gè)菜只需要新增加一個(gè)廚師就行了,原來的廚師還在做原來的工作,這樣你的設(shè)計(jì)就對(duì)修改封閉了。工廠方法模式結(jié)構(gòu)  圖4優(yōu)點(diǎn):優(yōu)化簡單工廠模式,做到“開-閉”原則??勺龅桨丫唧w的產(chǎn)品創(chuàng)建過程延遲到具體的子類工廠。缺點(diǎn):對(duì)于創(chuàng)建不同系列的產(chǎn)品無能為力。 抽象工廠模式生活例子      你發(fā)現(xiàn)菜可

5、分成許多菜系,魯菜、粵菜、湘菜等等,它們各有各的風(fēng)味,同樣是紅燒肉由不同菜系出來的味道也各不相同。如果你的廚師都是魯菜風(fēng)味,廣東的朋友來了吃不慣,怎么辦?現(xiàn)在我們?cè)倩氐胶唵喂S模式,我們把紅燒肉再向下繼承,生成魯菜紅燒肉、粵菜紅燒肉、湘菜紅燒肉;清蒸魚向下繼承為魯菜清蒸魚、粵菜清蒸魚、湘菜清蒸魚。我們也修改一下廚師這個(gè)類,不讓其返回食物基類,而是返回紅燒肉、清蒸魚、這一層次,并把這些方法抽象化,作為菜系工廠基類,然后再從此基類繼承出,魯菜工廠、粵菜工廠、湘菜工廠等等,再由這些具體工廠實(shí)現(xiàn)創(chuàng)建具體菜的工作。            

6、60;       圖5    現(xiàn)在可以看到,想新來做一個(gè)菜系,只需新聘請(qǐng)一個(gè)廚師就可以了,多么完美,但是你先別高興太早,如果你想新增加一個(gè)菜就變得非常困難了。抽象工廠模式結(jié)構(gòu)圖6抽象工廠模式代碼#include <iostream>#include <string>using namespace std;/紅燒肉class CHongshaoroupublic: virtual CHongshaorou() ; /產(chǎn)品使用公共接口 virtual void Start() = 0;/抽象基類,純虛函數(shù)由派生類

7、去實(shí)現(xiàn); /魯菜紅燒肉class CHongshaorouLucai : public CHongshaoroupublic: CHongshaorouLucai() cout << "制作魯菜紅燒肉." << endl; virtual CHongshaorouLucai() ; virtual void Start() cout << "魯菜紅燒肉好了." << endl; ;/粵菜紅燒肉class CHongshaorouYuecai : public CHongshaoroupublic: CHon

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

9、ngyuLucai : public Cqingzhengyupublic: CqingzhengyuLucai() cout << "制作魯菜清蒸魚." << endl; virtual CqingzhengyuLucai() ; virtual void Start() cout << "魯菜清蒸魚好了." << endl; ; /粵菜清蒸魚class CqingzhengyuYuecai : public Cqingzhengyupublic: CqingzhengyuYuecai() cout &l

10、t;< "制作粵菜清蒸魚." << endl; virtual CqingzhengyuYuecai() ; virtual void Start() cout << "粵菜清蒸魚好了." << endl; ;/抽象工廠class CFactorypublic: virtual CFactory(); virtual CHongshaorou* CreateHongshaorou() = 0; virtual Cqingzhengyu* Createqingzhengyu() = 0;/魯菜工廠class CLu

11、caiFactory : public CFactorypublic: CLucaiFactory() cout << "制作魯菜工廠." << endl; virtual CLucaiFactory(); virtual CHongshaorou* CreateHongshaorou() return new CHongshaorouLucai; ; virtual Cqingzhengyu* Createqingzhengyu() return new CqingzhengyuLucai; ;/粵菜工廠class CYuecaiFactory :

12、 public CFactorypublic: CYuecaiFactory() cout << "制作粵菜工廠." << endl; virtual CYuecaiFactory(); virtual CHongshaorou* CreateHongshaorou() return new CHongshaorouYuecai; ; virtual Cqingzhengyu* Createqingzhengyu() return new CqingzhengyuYuecai; ;void Test(CFactory* pFactory) CHong

13、shaorou* pHongshaorou = NULL; Cqingzhengyu* pqingzhengyu = NULL; pHongshaorou = pFactory->CreateHongshaorou();/制作紅燒肉 pqingzhengyu = pFactory->Createqingzhengyu();/制作清蒸魚 pHongshaorou->Start(); pqingzhengyu->Start(); delete pqingzhengyu; delete pHongshaorou;int main() CFactory* pFactory =

14、NULL;/抽象工廠 /魯菜工廠。做紅燒肉,清蒸魚 pFactory = new CLucaiFactory;/制作魯菜工廠 Test(pFactory); delete pFactory; cout<<endl; /粵菜工廠。做紅燒肉,清蒸魚 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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論