作用:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
UML結構圖:
解析:
Singleton模式其實是對全局靜態變量的一個取代策略,上面提到的Singleton模式的兩個作用在C++中是通過如下的機制實現的:1)僅有一個實例,提供一個類的靜態成員變量,大家知道類的靜態成員變量對於一個類的所有對象而言是惟一的 2)提供一個訪問它的全局訪問點,也就是提供對應的訪問這個靜態成員變量的靜態成員函數,對類的所有對象而言也是惟一的.在C++中,可以直接使用類域進行訪問而不必初始化一個類的對象.
下面的實現其實是Singleton的一個簡單實現,並不是特別的通用,一般的,如果一個項目中需要使用到Singleton模式比較多的話,那麼一般會實現一個Singleton的模板類,模板類的模板參數是需要采用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;
}