單件模式(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;
}
運行上面代碼需在VC++6中設置:
1、工程-設置-C/C++中,分類欄選擇“Code Generation”,User run-time library:下選擇Debug Multithreaded
2、工程-設置-連接中,分類欄選擇“輸入”,忽略庫中輸入Nafxcwd.lib,并在對象/庫模塊欄最前面加上Nafxcwd.lib
運行后可以看到,多線程只生成了一個實例。
運行結果為:
啟動任務管理器
任務管理器已啟動
任務管理器已啟動
任務管理器已啟動