单例模式的两种设计

单例模式确保一个类只有一个实例,并提供一个全局访问点。


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;
相关推荐
m0_617493946 分钟前
Python OpenCV 孔洞检测与缺陷分析详解与实战
开发语言·python·opencv
hsg771 小时前
简述:Rust、GeoRust、自主研发GIS平台
开发语言·后端·rust
承渊政道1 小时前
飞算Java炫技赛:Java×Unity数字孪生园区平台的从零落地记录
java·开发语言·unity·技术分享·vibe coding·飞算javaai·飞算java ai炫技赛
不负岁月无痕1 小时前
STL --C++哈希表封装unordered_map/set
c++·visualstudio·哈希算法·散列表·unordered
wdfk_prog7 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
闻道且行之9 小时前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
许彰午10 小时前
95_Python内存管理与垃圾回收
开发语言·python
多加点辣也没关系11 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜11 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
c2385612 小时前
Bug 猎手入门指南
c++·算法·bug