常見設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之五-Singleton模式
作用:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
UML結(jié)構(gòu)圖:

解析:
Singleton模式其實(shí)是對全局靜態(tài)變量的一個(gè)取代策略,上面提到的Singleton模式的兩個(gè)作用在C++中是通過如下的機(jī)制實(shí)現(xiàn)的:1)僅有一個(gè)實(shí)例,提供一個(gè)類的靜態(tài)成員變量,大家知道類的靜態(tài)成員變量對于一個(gè)類的所有對象而言是惟一的 2)提供一個(gè)訪問它的全局訪問點(diǎn),也就是提供對應(yīng)的訪問這個(gè)靜態(tài)成員變量的靜態(tài)成員函數(shù),對類的所有對象而言也是惟一的.在C++中,可以直接使用類域進(jìn)行訪問而不必初始化一個(gè)類的對象.
下面的實(shí)現(xiàn)其實(shí)是Singleton的一個(gè)簡單實(shí)現(xiàn),并不是特別的通用,一般的,如果一個(gè)項(xiàng)目中需要使用到Singleton模式比較多的話,那么一般會(huì)實(shí)現(xiàn)一個(gè)Singleton的模板類,模板類的模板參數(shù)是需要采用Singleton模式的類,比如這樣實(shí)現(xiàn):
template<typename?T>
class?Singleton


{
//
.類的聲明
};

//?需要采用singleton模式的類
class?Test
???:?public?Singleton<Test>


{
//?
類的聲明
};
但是,下面的實(shí)現(xiàn)還是采用最簡單的實(shí)現(xiàn)辦法,起的是演示的作用
實(shí)現(xiàn):
1)Singleton.h

/**//********************************************************************
????created:????2006/07/20
????filename:?????Singleton.h
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????Singleton模式的演示代碼
*********************************************************************/

#ifndef?SINGLETON_H
#define?SINGLETON_H

class?Singleton


{
public:

????Singleton()
{};

????~Singleton()
{};

????//?靜態(tài)成員函數(shù),提供全局訪問的接口
????static?Singleton*?GetInstancePtr();
????static?Singleton??GetInstance();

????void?Test();

private:
????//?靜態(tài)成員變量,提供全局惟一的一個(gè)實(shí)例
????static?Singleton*?m_pStatic;
};

#endif
2)Singleton.cpp

/**//********************************************************************
????created:????2006/07/20
????filename:?????Singleton.cpp
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????Singleton模式的演示代碼
*********************************************************************/

#include?"Singleton.h"
#include?<iostream>

//?類的靜態(tài)成員變量要在類體外進(jìn)行定義
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:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????Singleton模式的測試代碼
*********************************************************************/

#include?"Singleton.h"
#include?<stdlib.h>

int?main()


{
????//?不用初始化類對象就可以訪問了
????Singleton::GetInstancePtr()->Test();
????Singleton::GetInstance().Test();

????system("pause");

????return?0;
}
UML結(jié)構(gòu)圖:

解析:
Singleton模式其實(shí)是對全局靜態(tài)變量的一個(gè)取代策略,上面提到的Singleton模式的兩個(gè)作用在C++中是通過如下的機(jī)制實(shí)現(xiàn)的:1)僅有一個(gè)實(shí)例,提供一個(gè)類的靜態(tài)成員變量,大家知道類的靜態(tài)成員變量對于一個(gè)類的所有對象而言是惟一的 2)提供一個(gè)訪問它的全局訪問點(diǎn),也就是提供對應(yīng)的訪問這個(gè)靜態(tài)成員變量的靜態(tài)成員函數(shù),對類的所有對象而言也是惟一的.在C++中,可以直接使用類域進(jìn)行訪問而不必初始化一個(gè)類的對象.
下面的實(shí)現(xiàn)其實(shí)是Singleton的一個(gè)簡單實(shí)現(xiàn),并不是特別的通用,一般的,如果一個(gè)項(xiàng)目中需要使用到Singleton模式比較多的話,那么一般會(huì)實(shí)現(xiàn)一個(gè)Singleton的模板類,模板類的模板參數(shù)是需要采用Singleton模式的類,比如這樣實(shí)現(xiàn):


















但是,下面的實(shí)現(xiàn)還是采用最簡單的實(shí)現(xiàn)辦法,起的是演示的作用
實(shí)現(xiàn):
1)Singleton.h





































2)Singleton.cpp











































3)Main.cpp

























posted on 2006-07-21 14:27 那誰 閱讀(3771) 評論(7) 編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式