1、意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2、适用性
在下面的情况下可以使用Singleton模式
1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2、适用性
在下面的情况下可以使用Singleton模式
1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
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;
};
class Room: public MapSite
{
public:
Room( int roomNo )
{
_roomNumber = roomNo;
}
Room( const Room &r )
{
_roomNumber = r._roomNumber;
}
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;
};
class Wall: public MapSite
{
public:
Wall()
{
}
virtual void Enter()
{
}
};
class Door:public MapSite
{
public:
Door()
{
}
virtual void Enter()
{
}
Room* OtherSideFrom( Room *r )
{
return NULL;
}
private:
Room* _room1;
Room* _room2;
};
class Maze
{
public:
Maze()
{
}
void AddRoom( Room *r )
{
_room = r;
}
Room* RoomNo( int no ) const
{
return new Room( no );
}
private:
Room *_room;
};
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;
}
static MazeFactory* Instance( )
{
if ( NULL == _instance )
{
_instance = new MazeFactory;
}
return _instance;
}
private:
static MazeFactory* _instance;
};
MazeFactory* MazeFactory::_instance = NULL;
class MazeGame
{
public:
MazeGame( )
{
}
Maze* CreateMaze( )
{
Maze* aMaze = new Maze;
MazeFactory *mazeFactory = MazeFactory::Instance();
Room *r1 = mazeFactory->MakeRoom( 1 );
Room *r2 = mazeFactory->MakeRoom( 2 );
Door *theDoor = mazeFactory->MakeDoor( r1, r2 );
aMaze->AddRoom( r1 );
aMaze->AddRoom( r2 );
r1->SetSide( North, mazeFactory->MakeWall() );
r1->SetSide( East, theDoor );
r1->SetSide( South, mazeFactory->MakeWall() );
r1->SetSide( West, mazeFactory->MakeWall() );
r2->SetSide( North, mazeFactory->MakeWall() );
r2->SetSide( East, mazeFactory->MakeWall() );
r2->SetSide( South, mazeFactory->MakeWall() );
r2->SetSide( West, theDoor );
return aMaze;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MazeGame *game = new MazeGame;
Maze* bommaze = game->CreateMaze();
return 0;
}