設計模式之 singleton

常見設計模式的解析和實現(C++)之五-Singleton模式

作用:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

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()中加入同步機制。
發佈了11 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章