C++ 實現單例模式

實現

#pragma once

#include <windows.h>

/*
使用臨界區來枷鎖和解鎖
*/
class LockBase
{
private:
    // Singleton是LockBase友元,在Singleton類內部可以訪問LockBase的私有成員
    friend class Singleton;
    CRITICAL_SECTION cs;
    void lock()
    {
        EnterCriticalSection(&cs);
    }
    void unlock()
    {
        LeaveCriticalSection(&cs);
    }
public:
    LockBase()
    {
        InitializeCriticalSection(&cs);
    }
    ~LockBase()
    {
        DeleteCriticalSection(&cs);
    }
};

class Singleton
{
private:
    static Singleton* instance;
    Singleton(){}
public:
    static Singleton* getInstance()
    {
        // 使用雙重檢驗枷鎖機制
        if (NULL == instance)
        {
            LockBase* lockBase = new LockBase();
            lockBase->lock();
            if (NULL == instance)
            {
                instance = new Singleton();
            }
            lockBase->unlock();
        }
        return instance;
    }
};
// 注意C++中靜態變量在類內是聲明,在類外是定義
Singleton* Singleton::instance = NULL;

測試

#include "Singleton.h"

#include <iostream>

using namespace std;

int main()
{
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    if (s1 == s2)
    {
        cout << "s1 和 s2 指向是同一個對象" << endl;
    }

    return 0;
}

注意

注意代碼的細節,注意C++中靜態變量的定義是在類外。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章