程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> larbin 中的單例 概述

larbin 中的單例 概述

編輯:關於C語言
 

larbin 中的全局結構 

global.h//

struct global()

{

global();

static int a;

.....

}

global.cc 實現方法時用到的static變量 需要先 聲明初始化。

int global::a;

main中實現時只使用了一個實例。


 

而class單例則復雜些,不過可以更加安全 確保為實例為單一。

#include<iostream>
using namespace std;

class Singleton
{
public:
    static Singleton * GetInstance()//通過靜態公有函數獲得該類的實例對象
    {
        if(m_pInstance==NULL)
        m_pInstance=new Singleton();
        return m_pInstance;
    }

private:
    Singleton(){}//構造函數私有化的目的是為了防止從別處實例化該類對象
    static Singleton * m_pInstance;
    class Garbo//刪除Singleton實例的對象
    {
    public:
        ~Garbo()
        {
            if(Singleton::m_pInstance)
            {
                delete Singleton::m_pInstance;
            }
        }
    };
    static Garbo gb;//在程序結束時,系統會調用它的析構函數
};
Singleton * Singleton::m_pInstance=NULL;//初始化靜態數據成員

int main()
{
    Singleton *sl=Singleton::GetInstance();
    return 0;
}

此例 很好的使用了單例模式!

單例不自動限制了多次的初始化,而且可以限定為具體幾個實例。但是不此處不能保證唯一的實例何時被銷毀。因此借鑒http://www.haogongju.net/art/1489844 朋友的文章。加入

 

class CSingleton

{

//其他成員

public:

static CSingleton* GetInstance();

private:

    CSingleton(){};

    static CSingleton * m_pInstance;

class CGarbo //它的唯一工作就是在析構函數中刪除CSingleton的實例

{

        public:

            ~CGarbo()

            {

                if( CSingleton::m_pInstance )

                  delete CSingleton::m_pInstance;

};

         }

        Static CGabor Garbo; //定義一個靜態成員,程序結束時,系統會自動調用它的析構函數

};

 

類CGarbo被定義為CSingleton的私有內嵌類,以防該類被在其他地方濫用。

程序運行結束時,系統會調用CSingleton的靜態成員Garbo的析構函數,該析構函數會刪除單例的唯一實例。

單例模式也稱為單件模式、單子模式,可能是使用最廣泛的設計模式。其意圖是保證一個類僅有一個實例,並提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。有很多地方需要這樣的功能模塊,如系統的日志輸出,GUI應用必須是單鼠標,MODEM的聯接需要一條且只需要一條電話線,操作系統只能有一個窗口管理器,一台PC連一個鍵盤。如log之類的模塊 ,被單例後,也要有被銷毀的時候。所以內嵌類,還是很靠譜的!!

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