作用:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
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
![]()
![]()
{
private:
![]()
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;
}
轉貼自:http://www.cppblog.com/converse/archive/2006/07/21/10309.html
這裏singleton模式主要用於使一個類只能創建一個對象,相當於將對象變成了全局靜態對象。有一點,要注意的是,在多線程情況下,當多個線程同時訪問m_pStatic變量時,可能會產生多個對象,避免這一點需要在getinstancePtr()中加入同步機制。