版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、題目:抽象工廠模式學生姓名 張 婧 學 號 201021077 院 系 信息科學與技術(shù)學院 專 業(yè) 計算機應用技術(shù) 年 級 2010 級 抽象工廠模式在軟件系統(tǒng)中,經(jīng)常面臨著“一系列相互依賴的對象”的創(chuàng)建工作;同時由于需求的變化,往往存在著更多系列對象的創(chuàng)建工作。如何應對這種變化?如何繞過常規(guī)的對象的創(chuàng)建方法(new),提供一種“封裝機制”來避免客戶程序和這種“多系列具體對象創(chuàng)建工作”的緊耦合?這就要用到抽象工廠模式。抽象工廠模式是簡單工廠模式和工廠方法模式的升級版,它有更大的靈活性,同時也更加復雜一些。為了理解抽象工廠,我們考慮這樣一個實際例子:如果你想吃飯了,怎么辦自己做嗎?自己做就相當于
2、程序中直接使用new。當然是自己下個指令,別人來做更爽。那就把做飯的任務交給廚師吧,那么他就是一個做飯的工廠了,你告訴他要吃紅燒肉,等會他就從廚房給你端出來一盤香噴噴的紅燒肉了,再來個清蒸魚吧。下圖 1 就是這個問題的模型。 圖1 顯然到了這里,你是Client,廚師就是工廠,他擁有做紅燒肉的方法,做清蒸魚的方法,這些方法返回值就是食物抽象。紅燒肉、清蒸魚就是食物的繼承類,簡單工廠模式也成型了。簡單工廠模式結(jié)構(gòu) 圖2優(yōu)點:允許客戶端相對獨立的創(chuàng)建產(chǎn)品的過程,并且在系統(tǒng)引入新產(chǎn)品的時候無需修改客戶端。 缺點:對修改不封閉,新增加產(chǎn)品您要修改工廠。違法了開閉法則
3、(OCP)。工廠方法模式生活例子: 廚師手藝再好,總有不會做的菜,你想吃回鍋肉,怎么辦,讓廚師學唄,于是就給他新增了做回鍋肉的方法,以后你再想吃一個新菜,就要給廚師新加一個方法,顯然此做法的缺點也就暴露出來了,用程序設計的描述就是對修改永遠不能封閉。 面對上面對修改不能封閉的問題,有沒有好的解決方案嗎?把廚師抽象變成一個基類,你請幾個具體的廚師,分別有做清蒸魚的,做紅燒肉的廚師,如果你想吃一個新菜,就再新找個廚師,從你的廚師基類繼承一下,讓他來做這個新菜?,F(xiàn)在來看這個模式發(fā)生了變化,結(jié)構(gòu)中
4、多了一個廚師的抽象,抽象并不具體的加工產(chǎn)品了,至于做什么,是由這個抽象工廠的繼承子類來實現(xiàn),現(xiàn)在的模式也就變成工廠方法模式了,這個上面的結(jié)構(gòu)圖1就變成了下面的圖3的結(jié)構(gòu)了。 圖3 現(xiàn)在再來分析現(xiàn)在的模式,顯然簡單工廠的缺陷解決了,新增加一個菜只需要新增加一個廚師就行了,原來的廚師還在做原來的工作,這樣你的設計就對修改封閉了。工廠方法模式結(jié)構(gòu) 圖4優(yōu)點:優(yōu)化簡單工廠模式,做到“開-閉”原則??勺龅桨丫唧w的產(chǎn)品創(chuàng)建過程延遲到具體的子類工廠。缺點:對于創(chuàng)建不同系列的產(chǎn)品無能為力。 抽象工廠模式生活例子 你發(fā)現(xiàn)菜可
5、分成許多菜系,魯菜、粵菜、湘菜等等,它們各有各的風味,同樣是紅燒肉由不同菜系出來的味道也各不相同。如果你的廚師都是魯菜風味,廣東的朋友來了吃不慣,怎么辦?現(xiàn)在我們再回到簡單工廠模式,我們把紅燒肉再向下繼承,生成魯菜紅燒肉、粵菜紅燒肉、湘菜紅燒肉;清蒸魚向下繼承為魯菜清蒸魚、粵菜清蒸魚、湘菜清蒸魚。我們也修改一下廚師這個類,不讓其返回食物基類,而是返回紅燒肉、清蒸魚、這一層次,并把這些方法抽象化,作為菜系工廠基類,然后再從此基類繼承出,魯菜工廠、粵菜工廠、湘菜工廠等等,再由這些具體工廠實現(xiàn)創(chuàng)建具體菜的工作。
6、60; 圖5 現(xiàn)在可以看到,想新來做一個菜系,只需新聘請一個廚師就可以了,多么完美,但是你先別高興太早,如果你想新增加一個菜就變得非常困難了。抽象工廠模式結(jié)構(gòu)圖6抽象工廠模式代碼#include <iostream>#include <string>using namespace std;/紅燒肉class CHongshaoroupublic: virtual CHongshaorou() ; /產(chǎn)品使用公共接口 virtual void Start() = 0;/抽象基類,純虛函數(shù)由派生類
7、去實現(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ù)由派生類去實現(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)點:將客戶端與具體的類分離。一個產(chǎn)品系列中的多個對象被設計在一起工作,能保證客戶端始終只使用一個產(chǎn)品系列,且有利于更新產(chǎn)品系列。缺點:難以支持新品種產(chǎn)品。抽象工廠模式與工廠方法模式的區(qū)別 a重點不同。工廠方法模式強調(diào)的是不同的創(chuàng)建者根據(jù)自身需求去生產(chǎn)不同的具體產(chǎn)品,重點是生產(chǎn)具體產(chǎn)品;而抽象工廠模式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球及中國運動刺激療法行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國鋼制螺旋錐齒輪行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國戶外電氣箱行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球軸承精密滾珠行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國QUV紫外老化試驗箱行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025房地產(chǎn)公司辦公區(qū)空調(diào)安裝合同
- 理療店項目合作合同范本
- 委托的貨物運輸合同范本
- 鋼板租賃合同書
- 干股協(xié)議書范本合同
- 蛋糕店服務員勞動合同
- 土地買賣合同參考模板
- 2025高考數(shù)學二輪復習-專題一-微專題10-同構(gòu)函數(shù)問題-專項訓練【含答案】
- 2025年天津市政建設集團招聘筆試參考題庫含答案解析
- 2024-2030年中國烘焙食品行業(yè)運營效益及營銷前景預測報告
- 寧德時代筆試題庫
- 康復醫(yī)院患者隱私保護管理制度
- 新課標I、Ⅱ卷 (2024-2020) 近五年高考英語真題滿分作文
- 公司安全事故隱患內(nèi)部舉報、報告獎勵制度
- 沈陽理工大學《數(shù)》2022-2023學年第一學期期末試卷
- 共享單車安全知識
評論
0/150
提交評論