单例模式确保一个类只有一个实例,并提供一个全局访问点。
1. 饿汉模式 (Eager Initialization)
饿汉模式在程序启动时就创建实例,线程安全。
cpp
class EagerSingleton { public: // 删除拷贝构造函数和赋值运算符 EagerSingleton(const EagerSingleton&) = delete; EagerSingleton& operator=(const EagerSingleton&) = delete; // 提供全局访问点 static EagerSingleton& getInstance() { return instance; } void doSomething() { std::cout << "EagerSingleton is doing something." << std::endl; } private: // 私有构造函数 EagerSingleton() = default; // 类加载时就初始化实例 static EagerSingleton instance; }; // 在类外初始化静态成员 EagerSingleton EagerSingleton::instance;
特点:
线程安全(因为实例在main函数之前初始化)
简单直接
可能造成资源浪费(如果从未使用)
2. 懒汉模式 (Lazy Initialization)
懒汉模式在第一次使用时才创建实例,需要考虑线程安全问题。
双重检查锁定版(传统线程安全实现)
cpp
#include <mutex> class DoubleCheckedLockingSingleton { public: static DoubleCheckedLockingSingleton& getInstance() { if (instance == nullptr) { std::lock_guard<std::mutex> lock(mutex); if (instance == nullptr) { instance = new DoubleCheckedLockingSingleton(); } } return *instance; } void doSomething() { std::cout << "DoubleCheckedLockingSingleton is doing something." << std::endl; } private: DoubleCheckedLockingSingleton() = default; ~DoubleCheckedLockingSingleton() = default; DoubleCheckedLockingSingleton(const DoubleCheckedLockingSingleton&) = delete; DoubleCheckedLockingSingleton& operator=(const DoubleCheckedLockingSingleton&) = delete; static DoubleCheckedLockingSingleton* instance; static std::mutex mutex; }; // 初始化静态成员 DoubleCheckedLockingSingleton* DoubleCheckedLockingSingleton::instance = nullptr; std::mutex DoubleCheckedLockingSingleton::mutex;