1、意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、适用性
在以下情况可以使用Abstract Factory模式
1)一个系统要独立于它的产品的创建、组合和表示时。
2)一个系统要由多个产品系列中的一个来配置时。
3)当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4)当你提供一个产品类库,而只想显示它们的接口而不是实现时。
3、C++实例
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、适用性
在以下情况可以使用Abstract Factory模式
1)一个系统要独立于它的产品的创建、组合和表示时。
2)一个系统要由多个产品系列中的一个来配置时。
3)当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4)当你提供一个产品类库,而只想显示它们的接口而不是实现时。
3、C++实例
// Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <list>
#include <string>
using namespace std;
enum Direction
{
North = 0,
South,
East,
West
};
class MapSite
{
public:
virtual void Enter()=0;
};
// abstract product
class Room: public MapSite
{
public:
Room( int roomNo )
{
_roomNumber = roomNo;
}
MapSite* GetSide( Direction d ) const
{
return _sides[d];
}
void SetSide( Direction d, MapSite *m )
{
_sides[d] = m;
}
virtual void Enter()
{
}
private:
MapSite *_sides[4];
int _roomNumber;
};
// product
class RoomWithABomb:public Room
{
public:
RoomWithABomb( int roomNo ): Room( roomNo )
{
_roomNumber = roomNo;
}
MapSite* GetSide( Direction d ) const
{
return _sides[d];
}
void SetSide( Direction d, MapSite *m )
{
_sides[d] = m;
}
virtual void Enter()
{
}
// ......Bomb
private:
MapSite *_sides[4];
int _roomNumber;
// Bomb
};
// abstract product
class Wall: public MapSite
{
public:
Wall()
{
}
virtual void Enter()
{
}
};
// product
class BombedWall: public Wall
{
public:
BombedWall()
{
}
virtual void Enter()
{
}
// ......Bomb
};
// abstract product
class Door:public MapSite
{
public:
Door( Room* r1 = NULL, Room* r2 = NULL )
{
_room1 = r1;
_room2 = r2;
}
virtual void Enter()
{
}
Room* OtherSideFrom( Room *r )
{
return NULL;
}
private:
Room* _room1;
Room* _room2;
bool _isOpen;
};
class Maze
{
public:
Maze()
{
}
void AddRoom( Room *r )
{
_room = r;
}
Room* RoomNo( int ) const
{
return NULL;
}
private:
Room *_room;
};
// abstract factory
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 );
}
};
// concrete factory
class EnchantedMazeFactory:public MazeFactory
{
public:
EnchantedMazeFactory()
{
}
virtual Room* MakeRoom( int n ) const
{
// enchanted room
return new Room( n );
}
virtual Door* MakeDoor( Room *r1, Room *r2) const
{
// enchanted door
return new Door( r1, r2 );
}
};
// concrete factory
class BombedMazeFactory:public MazeFactory
{
public:
BombedMazeFactory()
{
}
virtual Room* MakeRoom( int n ) const
{
return new RoomWithABomb( n );
}
virtual Wall* MakeWall() const
{
return new BombedWall;
}
};
class MazeGame
{
public:
MazeGame( )
{
}
Maze* CreateMaze( MazeFactory &factory )
{
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;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MazeGame game;
BombedMazeFactory factory;
game.CreateMaze( factory );
return 0;
}