版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第二部分創(chuàng)建型設(shè)計模式工廠方法模式(FactoryMethodPattern)簡單工廠模式(SimpleFactoryPattern)單件模式(SingletonPattern)構(gòu)造器模式(BuilderPattern)原型模式(PrototypePattern)抽象工廠模式(AbstractFactoryPattern)工廠方法模式CreateAndUse()classClient{public: voidCreateAndUse(){
intsum=0; Dog*dog=newDog; sum+=dog->Sale(); deletedog;
Cat*cat=newCat; sum+=cat->Sale(); deletecat;
Fish*fish=newFish; sum+=fish->Sale(); deletefish;
cout<<sum<<endl; }voidOtherFuncs(){}};使用者與具體產(chǎn)品硬編碼,耦合緊密。不易適應(yīng)變化:增加Rabit產(chǎn)品增加BlackDog使用IAnimal接口呢?classClient{public: voidCreateAndUse(){
intsum=0;
IAnimal*
ani=newDog; sum+=ani>Sale(); deleteani;
IAnimal*
ani=newCat; sum+=cat->Sale(); deleteani;
IAnimal*
ani=newFish; sum+=ani>Sale(); deleteani;
cout<<sum<<endl; }voidOtherFuncs(){}};穩(wěn)定與變化的部分穩(wěn)定Client的多個功能需要實例化各種產(chǎn)品產(chǎn)品的訪問接口(Sale功能)變化子類種類增加產(chǎn)品的創(chuàng)建方式(如不同參數(shù),不同過程等)對Client采用分離各產(chǎn)品的實例化分離實例化部分 voidOtherFuncs(){}
IAnimal*CreateDog();
IAnimal*CreateCat();
IAnimal*CreateFish();};classClient{public: voidCreateAndUse(){
intsum=0;
IAnimal*ani=CreateDog(); sum+=ani->Sale(); deleteani;
IAnimal*ani=CreateCat(); sum+=ani->Sale(); deleteani;
IAnimal*ani=CreateFish(); sum+=ani->Sale(); deleteani;
cout<<“TotalSale:”<<sum; }工廠方法將工廠方法獨立出來classClient{public: voidCreateAndUse(Factory&fac){
intsum=0;
IAnimal*ani=fac.
CreateDog(); sum+=ani->Sale(); deleteani;
IAnimal*ani=fac.CreateCat(); sum+=ani->Sale(); deleteani;
IAnimal*ani=fac.
CreateFish(); sum+=ani->Sale(); deleteani;
cout<<“TotalSale:”<<sum; }
voidOtherFuncs(){}classFactory{
IAnimal*CreateDog();
IAnimal*CreateCat();
IAnimal*CreateFish();};甚至合并工廠方法classFactory{
IAnimal*CreateAnimal(chartype){
if(type==‘D’)returnnewDog;
elseif(type==‘C’)returnnewCat;
elseif(type==‘F’)returnnewFish;
elsereturnNULL;
}};ClientclassClient{public: voidCreateAndUse(Factory&fac){
intsum=0;
IAnimal*ani=fac.
CreateAnimal(‘D’); sum+=ani->Sale(); deleteani;
IAnimal*ani=fac.CreateAnimal(‘C’); sum+=ani->Sale(); deleteani;
IAnimal*ani=fac.
CreateAnimal(‘F’); sum+=ani->Sale(); deleteani;
cout<<“TotalSale:”<<sum; }
voidOtherFuncs(){}工廠方法的基本解決方案適應(yīng)變化增加新的子類,如ProductC或Rabit增加新的子類,如ProductA1,ProductA2,BlackDog,WhiteDog增加各種子類,并且組合使用增加新的子類Rabit增加新的子類BlackDog,WhiteDog增加各種子類,并且組合使用辦法:可以定義多個工廠。工廠方法模式例-單工廠工廠方法模式例-多工廠工廠方法模式結(jié)構(gòu)工廠方法模式總結(jié)定義一個創(chuàng)建產(chǎn)品的接口(頂層工廠類),而由該接口的子類(具體工廠類),決定具體實例化哪種產(chǎn)品。即將產(chǎn)品的實例化延遲到接口的子類(具體工廠類)中。也稱多態(tài)性工廠方法模式或虛擬構(gòu)造子模式工廠方法模式的適用性優(yōu)點擴展產(chǎn)品時,完全支持開閉原則;新增子類產(chǎn)品新增產(chǎn)品樹用同構(gòu)的產(chǎn)品樹替換原有產(chǎn)品樹具有對應(yīng)的層次結(jié)構(gòu),Client只通過產(chǎn)品的抽象接口交互,不必明確知道具體的產(chǎn)品不足子類數(shù)量可能較多(有時可用類模版減少子類數(shù)量)迷宮游戲例-工廠方法模式ClassMazeFactory{Public:
Maze*CreateMaze();
//工廠方法
virtualMaze*MakeMaze()const{
returnnewMaze;}//模版方法模式virtualRoom*MakeRoom()const{
returnnewRoom;}
virtualWall*MakeRoom(intn){
returnnewRoom(n);}virtualDoor*MakeDoor(Room*r1,Room*r2)const{returnnewDoor(r1,r2);}};
Maze*CreateMaze(){
Maze*aMaze=MakeMaze();Room*r1=MakeRoom(1);Room*r1=.MakeRoom(2);Door*door=MakeDoor(r1,r2);
aMaze->AddRoom(r1);
aMaze->AddRoom(r2);
r1->SetSide(North,makeWall());r1->SetSide(East,door);r1->SetSide(South,makeWall());r1->SetSide(West,makeWall());r2->SetSide(North,makeWall());r2->SetSide(East,makeWall());r2->SetSide(South,makeWall());r2->SetSide(West,door);
returnaMaze;
}MazeFactory的子類BombedMazeFactoryclassBombedMazeFactory:public
MazeFactor{Public:
BombedMazeFactory();virtualWall*MakeWall()const{
returnnewBombedWall;}virtualRoom*MakeRoom(intn)const{
returnnewRoomWithABomb(n);}};MazeFactory的子類EnchantedMazeFactoryclassEnchantedMazeFactory:public
MazeFactroy{public:
EnchantedMazeFactory();virtualRoom*MakeRoom(intn)const{returnnewEnchantedRoom(n,CastSpell());}VirtualDoor*MakeDoor(Room*r1,Room*r2)const{returnnewDoorNeedingSpell(r1,r2);}protected:Spell*CastSpell()const;};Factory的使用ClassGame{Public:
Game(MazeFactory&fac){
aMaze=fac.CreateMaze();}Private:Maze*aMaze;};Factory中的CreateMaze也可以放到Game中。ClassGame{Public:
Game(MazeFactory&fac){
aMaze=CreateMaze(fac);}Protected:Maze*CreateMaze(MazeFactory&fac){//將例中的MakeRoom等改成
//fac.MakeRoom。略}Pr
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人房產(chǎn)買賣標(biāo)準(zhǔn)協(xié)議樣本(2024年版)版B版
- 個人債權(quán)轉(zhuǎn)讓協(xié)議(2024版)3篇
- 個人手車買賣合同
- 專業(yè)軟件技術(shù)開發(fā)服務(wù)協(xié)議(2024年更新版)版B版
- 二零二四商場LED顯示屏采購與安裝合同
- 2025年度城市綜合體配套廠房建造與裝修承包合同范本4篇
- 2025年度廠房土地開發(fā)及使用權(quán)出讓合同4篇
- 2025年度插座產(chǎn)品售后服務(wù)網(wǎng)絡(luò)建設(shè)合同4篇
- 2025年度科技園區(qū)場地轉(zhuǎn)租及知識產(chǎn)權(quán)保護(hù)協(xié)議4篇
- 2024年05月上海華夏銀行上海分行招考筆試歷年參考題庫附帶答案詳解
- 干部基本信息審核認(rèn)定表
- 2023年11月外交學(xué)院(中國外交培訓(xùn)學(xué)院)2024年度公開招聘24名工作人員筆試歷年高頻考點-難、易錯點薈萃附答案帶詳解
- 春節(jié)行車安全常識普及
- 電機維護(hù)保養(yǎng)專題培訓(xùn)課件
- 汽車租賃行業(yè)利潤分析
- 春節(jié)拜年的由來習(xí)俗來歷故事
- 2021火災(zāi)高危單位消防安全評估導(dǎo)則
- 佛山市服務(wù)業(yè)發(fā)展五年規(guī)劃(2021-2025年)
- 房屋拆除工程監(jiān)理規(guī)劃
- 醫(yī)院保安服務(wù)方案(技術(shù)方案)
- 高效能人士的七個習(xí)慣:實踐應(yīng)用課程:高級版
評論
0/150
提交評論