設計模式之 抽象工廠(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);
}