版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、題目:抽象工廠模式學(xué)生姓名張 婧學(xué)號201021077院系信息科學(xué)與技術(shù)學(xué)院專業(yè) 計算機(jī)應(yīng)用技術(shù)年級2010級抽象工廠模式在軟件系統(tǒng)中,經(jīng)常面臨著“一系列相互依賴的對象”的創(chuàng)建工作;同時由 于需求的變化,往往存在著更多系列對象的創(chuàng)建工作。 如何應(yīng)對這種變化?如何 繞過常規(guī)的對象的創(chuàng)建方法(new),提供一種“封裝機(jī)制”來避免客戶程序和 這種“多系列具體對象創(chuàng)建工作”的緊耦合?這就要用到抽象工廠模式。抽象工 廠模式是簡單工廠模式和工廠方法模式的升級版,它有更大的靈活性,同時也更加復(fù)雜一些。為了理解抽象工廠,我們考慮這樣一個實(shí)際例子:如果你想吃飯了,怎么辦自 己做嗎?自己做就相當(dāng)于程序中直接使用
2、new當(dāng)然是自己下個指令,別人來做 更爽。那就把做飯的任務(wù)交給廚師吧,那么他就是一個做飯的工廠了,你告訴他 要吃紅燒肉,等會他就從廚房給你端出來一盤香噴噴的紅燒肉了,再來個清蒸魚 吧。下圖1就是這個問題的模型。圖1顯然到了這里,你是 Client ,廚師就是工廠,他擁有做紅燒肉的方法,做清蒸魚的方法,這些方法返回值就是食物抽象。紅燒肉、清蒸魚就是食物的繼承類,簡單工廠模式也成型了。簡單工廠模式結(jié)構(gòu)A. 'i產(chǎn)品曲工廠"3"*包工產(chǎn)品AO:產(chǎn)品墓務(wù)產(chǎn)品a"乩R圖2優(yōu)點(diǎn):允許客戶端相對獨(dú)立的創(chuàng)建產(chǎn)品的過程, 并且在系統(tǒng)引入新產(chǎn)品的時候無 需修改客戶端。缺點(diǎn):對
3、修改不封閉,新增加產(chǎn)品您要修改工廠。違法了開閉法則( OCP。 工廠方法模式生活例子:廚師手藝再好,總有不會做的菜,你想吃回鍋肉,怎么辦,讓廚師學(xué)唄,于 是就給他新增了做回鍋肉的方法,以后你再想吃一個新菜,就要給廚師新加一個 方法,顯然此做法的缺點(diǎn)也就暴露出來了,用程序設(shè)計的描述就是對修改永遠(yuǎn)不 能封閉。面對上面對修改不能封閉的問題,有沒有好的解決方案嗎?把廚師抽象變 成一個基類,你請幾個具體的廚師,分別有做清蒸魚的,做紅燒肉的廚師,如果 你想吃一個新菜,就再新找個廚師,從你的廚師基類繼承一下,讓他來做這個新 菜?,F(xiàn)在來看這個模式發(fā)生了變化,結(jié)構(gòu)中多了一個廚師的抽象,抽象并不具體 的加工產(chǎn)品了
4、,至于做什么,是由這個抽象工廠的繼承子類來實(shí)現(xiàn),現(xiàn)在的模式 也就變成工廠方法模式了,這個上面的結(jié)構(gòu)圖 1就變成了下面的圖3的結(jié)構(gòu)了圖3現(xiàn)在再來分析現(xiàn)在的模式,顯然簡單工廠的缺陷解決了,新增加一個菜只 需要新增加一個廚師就行了,原來的廚師還在做原來的工作,這樣你的設(shè)計就對 修改封閉了。工廠方法模式結(jié)構(gòu)優(yōu)點(diǎn):優(yōu)化簡單工廠模式,做到“開-閉”原則。可做到把具體的產(chǎn)品創(chuàng)建過程 延遲到具體的子類工廠。缺點(diǎn):對于創(chuàng)建不同系列的產(chǎn)品無能為力。抽象工廠模式生活例子你發(fā)現(xiàn)菜可分成許多菜系,魯菜、粵菜、湘菜等等,它們各有各的風(fēng)味,同 樣是紅燒肉由不同菜系出來的味道也各不相同。 如果你的廚師都是魯菜風(fēng)味,廣 東的朋
5、友來了吃不慣,怎么辦?現(xiàn)在我們再回到簡單工廠模式,我們把紅燒肉再向下繼承,生成魯菜紅燒 肉、粵菜紅燒肉、湘菜紅燒肉;清蒸魚向下繼承為魯菜清蒸魚、粵菜清蒸魚、湘 菜清蒸魚。我們也修改一下廚師這個類,不讓其返回食物基類,而是返回紅燒肉、 清蒸魚、這一層次,并把這些方法抽象化,作為菜系工廠基類,然后再從此基類 繼承出,魯菜工廠、粵菜工廠、湘菜工廠等等,再由這些具體工廠實(shí)現(xiàn)創(chuàng)建具體 菜的工作。mt井InIUI I i i圖5T1現(xiàn)在可以看到,想新來做一個菜系,只需新聘請一個廚師就可以了,多 么完美,但是你先別高興太早,如果你想新增加一個菜就變得非常困難了。抽象工廠模式結(jié)構(gòu)圖6抽象工廠模式代碼#in e
6、lude <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 << "制作魯菜紅燒肉."<< en
7、dl;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 Start()cout <<
8、"粵菜紅燒肉好了 ." << 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;virtual Cq in gzhe ngyu
9、Lucai() ;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、 << 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 CLucaiFactory();vir
11、tual 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 CYuecaiFactory();virtual CHon
12、 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->CreateH on gsha
13、orou();/ 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):將客戶端與具體的類分離。一個產(chǎn)品系列中的多個對象被設(shè)計在一起工作, 能保證客戶端始終只使用一個產(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)品;而抽象工廠模式則定位為“在不指定實(shí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版土地租賃與使用權(quán)置換協(xié)議3篇
- 校企攜手2025年度共建紡織工藝培訓(xùn)基地合同3篇
- 二零二五年度文化藝術(shù)展覽場地臨時使用協(xié)議書3篇
- 2025版建筑工程碎石料采購與安全管理合同3篇
- 2025年度個人教育培訓(xùn)機(jī)構(gòu)投資合同書(教育連鎖版)4篇
- 二零二五年深海油氣資源開發(fā)電焊工勞務(wù)分包協(xié)議3篇
- 個人出租車的對外承包協(xié)議書 3篇
- 二零二五版淋浴房環(huán)保材料生產(chǎn)與應(yīng)用合同3篇
- 二零二五年度城市道路施工監(jiān)理合同標(biāo)準(zhǔn)版4篇
- 二零二五年度健康醫(yī)療大數(shù)據(jù)合作投資合同3篇
- 定額〔2025〕1號文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價格水平調(diào)整的通知
- 2024年城市軌道交通設(shè)備維保及安全檢查合同3篇
- 【教案】+同一直線上二力的合成(教學(xué)設(shè)計)(人教版2024)八年級物理下冊
- 湖北省武漢市青山區(qū)2023-2024學(xué)年七年級上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試卷(含解析)
- 單位往個人轉(zhuǎn)賬的合同(2篇)
- 科研倫理審查與違規(guī)處理考核試卷
- GB/T 44101-2024中國式摔跤課程學(xué)生運(yùn)動能力測評規(guī)范
- 高危妊娠的評估和護(hù)理
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫含答案解析
- 兒童10歲生日-百日宴-滿月酒生日會成長相冊展示(共二篇)
- 2023年高考全國甲卷數(shù)學(xué)(理)試卷【含答案】
評論
0/150
提交評論