單例模式(Singleton Pattern)是一種設計模式,用于確保一個類只有一個實例,并提供一個全局訪問點來訪問該實例。在C++中,單例模式通常用于管理全局資源或共享狀態。
以下是C++中實現單例模式的幾種常見方式:
- 懶漢式(Lazy Initialization)
懶漢式單例在第一次使用時才創建實例。
非線程安全版本:
class Singleton {
public:static Singleton& getInstance() {if (!instance) {instance = new Singleton();}return *instance;}// 刪除拷貝構造函數和賦值運算符Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {} // 私有構造函數~Singleton() {} // 私有析構函數static Singleton* instance; // 靜態實例指針
};Singleton* Singleton::instance = nullptr; // 初始化靜態成員
線程安全版本(使用雙重檢查鎖定):
#include <mutex>class Singleton {
public:static Singleton& getInstance() {if (!instance) {std::lock_guard<std::mutex> lock(mutex);if (!instance) {instance = new Singleton();}}return *instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}static Singleton* instance;static std::mutex mutex;
};Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
- 餓漢式(Eager Initialization)
餓漢式單例在程序啟動時即創建實例,線程安全。
class Singleton {
public:static Singleton& getInstance() {static Singleton instance; // 靜態局部變量,程序啟動時初始化return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}
};
- Meyer’s Singleton(靜態局部變量)
這是C++中最簡潔的單例實現方式,利用了靜態局部變量的特性(線程安全且懶加載)。
class Singleton {
public:static Singleton& getInstance() {static Singleton instance; // 靜態局部變量,線程安全且懶加載return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}
};