程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 設計模式的解析和實現(C++)之五-Singleton模式

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

編輯:關於C++

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

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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved