单件模式(Singleton)的目标是在应用程序中创建一个唯一的对象。
比较典型的例子就是Windows下的任务管理器。
单件模式的类图比较简单,如下:
下面实现一个多线程下的单件模式,代码如下:
//
TaskManager.h
#include " afxmt.h "
class TaskManager
{
public :
static TaskManager * Instence();
private :
TaskManager();
virtual ~ TaskManager();
static TaskManager * ms_instence;
static CCriticalSection ms_cs;
};
// TaskManager.cpp
#include " stdafx.h "
#include " TaskManager.h "
#include < iostream >
using namespace std;
TaskManager * TaskManager::ms_instence = 0 ;
CCriticalSection TaskManager::ms_cs;
TaskManager::TaskManager()
{
cout << " 启动任务管理器 " << endl;
}
TaskManager:: ~ TaskManager()
{
if (ms_instence != 0 )
{
delete ms_instence;
ms_instence = 0 ;
}
}
TaskManager * TaskManager::Instence()
{
ms_cs.Lock();
if (ms_instence == 0 )
{
ms_instence = new TaskManager;
}
else
{
cout << " 任务管理器已启动 " << endl;
}
ms_cs.Unlock();
return ms_instence;
}
// main.cpp
#include " stdafx.h "
#include " TaskManager.h "
#include < windows.h >
#include < process.h >
static DWORD WINAPI CreateThreadFun(LPVOID pParam)
{
TaskManager * manager = TaskManager::Instence();
TaskManager * manager1 = TaskManager::Instence();
return 0 ;
}
int main( int argc, char * argv[])
{
HANDLE hHandle;
DWORD dwThreadId;
hHandle = CreateThread(NULL, 0 , CreateThreadFun, LPVOID( 0 ), NULL, & dwThreadId);
TaskManager * manager = TaskManager::Instence();
TaskManager * manager1 = TaskManager::Instence();
Sleep( 2000 );
CloseHandle(hHandle);
return 0 ;
}
#include " afxmt.h "
class TaskManager
{
public :
static TaskManager * Instence();
private :
TaskManager();
virtual ~ TaskManager();
static TaskManager * ms_instence;
static CCriticalSection ms_cs;
};
// TaskManager.cpp
#include " stdafx.h "
#include " TaskManager.h "
#include < iostream >
using namespace std;
TaskManager * TaskManager::ms_instence = 0 ;
CCriticalSection TaskManager::ms_cs;
TaskManager::TaskManager()
{
cout << " 启动任务管理器 " << endl;
}
TaskManager:: ~ TaskManager()
{
if (ms_instence != 0 )
{
delete ms_instence;
ms_instence = 0 ;
}
}
TaskManager * TaskManager::Instence()
{
ms_cs.Lock();
if (ms_instence == 0 )
{
ms_instence = new TaskManager;
}
else
{
cout << " 任务管理器已启动 " << endl;
}
ms_cs.Unlock();
return ms_instence;
}
// main.cpp
#include " stdafx.h "
#include " TaskManager.h "
#include < windows.h >
#include < process.h >
static DWORD WINAPI CreateThreadFun(LPVOID pParam)
{
TaskManager * manager = TaskManager::Instence();
TaskManager * manager1 = TaskManager::Instence();
return 0 ;
}
int main( int argc, char * argv[])
{
HANDLE hHandle;
DWORD dwThreadId;
hHandle = CreateThread(NULL, 0 , CreateThreadFun, LPVOID( 0 ), NULL, & dwThreadId);
TaskManager * manager = TaskManager::Instence();
TaskManager * manager1 = TaskManager::Instence();
Sleep( 2000 );
CloseHandle(hHandle);
return 0 ;
}
运行上面代码需在VC++6中设置:
1、工程-设置-C/C++中,分类栏选择“Code Generation”,User run-time library:下选择Debug Multithreaded
2、工程-设置-连接中,分类栏选择“输入”,忽略库中输入Nafxcwd.lib,并在对象/库模块栏最前面加上Nafxcwd.lib
运行后可以看到,多线程只生成了一个实例。
运行结果为:
启动任务管理器
任务管理器已启动
任务管理器已启动
任务管理器已启动