首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

設計模式實作系列(五):Singleton 單例模式 - 確保全域唯一實例與存取點

     編輯:關於C++

模式意圖

保證一個類別僅有一個實例,並提供一個存取它的全域存取點。

UML 結構圖

Singleton Pattern UML

核心解析:靜態成員實現全域唯一

  • 私有建構子: 防止外部 new。
  • 靜態成員變數: 儲存唯一實例指標(m_pStatic)。
  • 靜態成員函數: GetInstance() 提供全域存取,首次呼叫時延遲建構。
  • C++ 特性: 可直接用類別域呼叫 Singleton::GetInstance(),無需物件實例。

C++ 基礎實作

1. Singleton.h

#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

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

Singleton* Singleton::m_pStatic = nullptr;

Singleton* Singleton::GetInstancePtr() {
    if (!m_pStatic) m_pStatic = new Singleton();
    return m_pStatic;
}
Singleton Singleton::GetInstance() { return *GetInstancePtr(); }
void Singleton::Test() { std::cout << "Test!\n"; }

3. Main.cpp

#include "Singleton.h"
#include <cstdlib>

int main() {
    Singleton::GetInstancePtr()->Test();
    Singleton::GetInstance().Test();
    return 0;
}

進階:執行緒安全與現代寫法

1. 雙重檢查鎖定(DCLP)

std::mutex mtx;
Singleton* Singleton::GetInstancePtr() {
    if (!m_pStatic) {
        std::lock_guard<std::mutex> lock(mtx);
        if (!m_pStatic) m_pStatic = new Singleton();
    }
    return m_pStatic;
}

2. C++11 局部靜態變數(推薦)

Singleton& Singleton::GetInstance() {
    static Singleton instance; // 執行緒安全、自動釋放
    return instance;
}

3. 模板化 Singleton 基類

template <typename T>
class Singleton {
protected:
    Singleton() {}
    ~Singleton() {}
public:
    static T& Instance() {
        static T instance;
        return instance;
    }
};

// 使用
class MyService : public Singleton<MyService> {
    friend class Singleton<MyService>;
    MyService() {}
};
MyService::Instance().DoWork();

適用場景與反模式警示

  • 適用:日誌管理器、配置管理、資料庫連線池、執行緒池、硬體裝置驅動。
  • 濫用風險:全域狀態導致耦合、測試困難、隱性依賴。能用依賴注入(DI)傳遞實例時,優先用 DI。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved