作用:保證一個類僅有一個執行個體,並提供一個訪問它的全域訪問點。
解析:
Singleton 模式其實是對全域靜態變數的一個取代策略,上面提到的 Singleton
模式的兩個作用在 C++中是通過如下的機制實現的:1)僅有一個執行個體,提供一個
類的靜態成員變數,大家知道類的靜態成員變數對於一個類的所有對象而言是惟
一的 2)提供一個訪問它的全域訪問點,也就是提供對應的訪問這個靜態成員變
量的靜態成員函數,對類的所有對象而言也是惟一的.在 C++中,可以直接使用類
域進行訪問而不必初始化一個類的對象.
下面的實現其實是 Singleton 的一個簡單實現,並不是特別的通用,一般的,如果
一個項目中需要使用到 Singleton 模式比較多的話,那麼一般會實現一個 Singl
eton 的模板類,模板類的模板參數是需要採用 Singleton 模式的類,比如這樣實
現:
template<typename T>
class Singleton
{
// .類的聲明
};
// 需要採用 singleton 模式的類
class Test
: public Singleton<Test>
{
// 類的聲明
};
但是,下面的實現還是採用最簡單的實現辦法,起的是示範的作用
實現:
1)Singleton.h
/**************************************************************
******
created: 2006/07/20
filename: Singleton.h
author: 李創
http://www.cppblog.com/converse/
purpose: Singleton 模式的示範代碼
****************************************************************
*****/
#ifndef SINGLETON_H
#define SINGLETON_H
class Singleton
{
public:
Singleton(){};
~Singleton(){};
// 靜態成員函數,提供全域訪問的介面
static Singleton* GetInstancePtr();
static Singleton GetInstance();
void Test();
private:
// 靜態成員變數,提供全域惟一的一個執行個體
static Singleton* m_pStatic;
};
#endif
2)Singleton.cpp
/**************************************************************
******
created: 2006/07/20
filename: Singleton.cpp
author: 李創
http://www.cppblog.com/converse/
purpose: Singleton 模式的示範代碼
****************************************************************
*****/
#include "Singleton.h"
#include <iostream>
// 類的靜態成員變數要在類體外進行定義
Singleton* Singleton::m_pStatic = NULL;
Singleton* Singleton::GetInstancePtr()
{
if (NULL == m_pStatic)
{
m_pStatic = new Singleton();
}
return m_pStatic;
}
Singleton Singleton::GetInstance()
{
return *GetInstancePtr();
}
void Singleton::Test()
{
std::cout << "Test!\n";
}
3)Main.cpp
/**************************************************************
******
created: 2006/07/20
filename: Main.cpp
author: 李創
http://www.cppblog.com/converse/
purpose: Singleton 模式的測試代碼
****************************************************************
*****/
#include "Singleton.h"
#include <stdlib.h>
int main()
{
// 不用初始化類對象就可以訪問了
Singleton::GetInstancePtr()->Test();
Singleton::GetInstance().Test();
system("pause");
return 0;
}