单例模式的两种设计

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


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;
相关推荐
JavaPub-rodert3 分钟前
我把 OpenAI 协议塞进了 Go 工具库:go-commons 开始支持 AI 了
开发语言·人工智能·golang
caimouse3 分钟前
ReactOS 图形系统分析(23):引擎内存管理 — mem.c
c语言·开发语言
caimouse4 分钟前
ReactOS 图形系统分析(15):窗口对象 — EWNDOBJ(engwindow.c)
c语言·开发语言
青 春 记 忆7 分钟前
零基础入门python07:让程序记住数据——JSON文件和异常处理
开发语言·windows·python·json·python3.11
举手13 分钟前
Epoll模型
linux·c++·学习
W_3260029 分钟前
Python 常用标准 / 第三方库:random、tqdm、turtle、jieba 用法
开发语言·python
Shadow(⊙o⊙)31 分钟前
Linux网络部分——TCP服务端、客户端架构分析多进程、多线程、线程池
c++·tcp/ip·架构
zh路西法1 小时前
【3D SLAM源码解读系列】(四) GTSAM与iSAM2——从回环约束到位姿图优化
c++·slam·gtsam·pgo·isam2
caimouse1 小时前
ReactOS 图形系统分析(17):区域填充 — EngPaint / IntEngPaint(paint.c)
c语言·开发语言·算法
北风toto1 小时前
研发效能与后端核心技术全景指南:从CI/CD到共性组件实战
java·开发语言·ci/cd