設計模式之 抽象工廠(Abstract Factory)---對象創建型模式

                         設計模式之 抽象工廠(Abstract Factory)

                                                   ---對象創建型模式

1.意圖

提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

2.別名 kit

3.適用性

1)一個系統要獨立於它的產品的創建、組合和表示時。
2)一個系統要由多個產品系列中的一個來配置時。
3)當你要強調一系列相關的產品對象的設計以便進行聯合使用時。
4)當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。

4.結構

                      


5.參與者

*AbstractFactory
---聲明一個創建抽象產品對象的接口。
*ConcreteFactory
---實現創建具體產品對象的操作。
*AbstractProduct
---爲一類產品對象聲明一個接口。
ConcreteProduct
---定義一個將相應的具體工廠創建的產品對象。
---實現AbstractProduct接口。
*Client
---僅使用AbstractFactory和AbstractProduct類聲明的接口。

6.協作

1)通常在運行時創建一個ConcreteFactory類的實例。這一具體的工廠創建具體的工廠創建具有特定實現的產品對象,爲創建不同產品的對象,客戶應使用不同的具體工廠。
2)AbstractFactory 將產品對象的創建延遲到他的ConcreteFactory子類。

7.實現

將工廠作爲單件 一個應用中一般每隔產品系列只需一個ConcreteFactory的實例。

8.代碼示例
/***********************************************************************
* 下面爲創建一個遊戲中的迷宮
*
*
* 對應關係
* Client----MazeGame
*
* AbstractFactory---MazeFactory
*
* ConcreteFactory----EnchantedMazeFactory ,BombedMazeFactory
*
* AbstractProduct -----Maze,Room,Wall,Door
*
* ConcreteProduct-----EnchantedRoom,RoomWithABomb....
*
*
*
*************************************************************************/


class MazeFactory {
public:
MazeFactory();

virtual Maze* MakeMaze() const
{ return new Maze; }
virtual Wall* MakeWall() const
{ return new Wall; }
virtual Room* MakeRoom(int n) const
{ return new Room(n); }
virtual Door* MakeDoor(Room* r1, Room* r2) const
{ return new Door(r1, r2); }
};

Maze* MazeGame::CreateMaze (MazeFactory& factory) {

/******************************************************************

注意參數是對MazeFactory的引用,以向上映射.
由函數體看出,客戶僅與MazeFactor (AbstractFactory)和幾個抽象產品(Maze,Room, Door,Wall) 作用,


*********************************************************************/
Maze* aMaze = factory.MakeMaze();
Room* r1 = factory.MakeRoom(1);
Room* r2 = factory.MakeRoom(2);
Door* aDoor = factory.MakeDoor(r1, r2);

aMaze->AddRoom(r1);
aMaze->AddRoom(r2);

r1->SetSide(North, factory.MakeWall());
r1->SetSide(East, aDoor);
r1->SetSide(South, factory.MakeWall());
r1->SetSide(West, factory.MakeWall());

r2->SetSide(North, factory.MakeWall());
r2->SetSide(East, factory.MakeWall());
r2->SetSide(South, factory.MakeWall());
r2->SetSide(West, aDoor);

return aMaze;
}

class EnchantedMazeFactory : public MazeFactory {
public:
EnchantedMazeFactory();

virtual Room* MakeRoom(int n) const
{ return new EnchantedRoom(n, CastSpell()); }

virtual Door* MakeDoor(Room* r1, Room* r2) const
{ return new DoorNeedingSpell(r1, r2); }

protected:
Spell* CastSpell() const;
};

#define EnchantedMazeFactory_H
#include "C++/MazeFactories.H"

Wall* BombedMazeFactory::MakeWall () const {
return new BombedWall;
}

Room* BombedMazeFactory::MakeRoom(int n) const {
return new RoomWithABomb(n);
}

void dummy() {

MazeGame game;
BombedMazeFactory factory;
//(參看協作部分)在運行時創建一個具體的遊戲迷宮(有炸彈)

game.CreateMaze(factory);



}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章