单例模式的两种设计

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


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;
相关推荐
小汉堡编程1 小时前
数据结构——vector数组c++(超详细)
数据结构·c++
weixin_472339464 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
枯萎穿心攻击4 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue6 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
tan180°6 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
m0_555762906 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
浪裡遊7 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
彭祥.7 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk8 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼8 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy