单例模式的两种设计

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


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;
相关推荐
blasit13 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_2 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星2 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛4 天前
delete又未完全delete
c++
端平入洛5 天前
auto有时不auto
c++
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端
norlan_jame5 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20215 天前
信号量和信号
linux·c++