《設(shè)計模式》-工廠方法_第1頁
《設(shè)計模式》-工廠方法_第2頁
《設(shè)計模式》-工廠方法_第3頁
《設(shè)計模式》-工廠方法_第4頁
《設(shè)計模式》-工廠方法_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論