C++单例模式的设计

单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在C++中,单例模式通常用于管理全局资源或共享状态。

以下是C++中实现单例模式的几种常见方式:

  1. 懒汉式(Lazy Initialization)
    懒汉式单例在第一次使用时才创建实例。

非线程安全版本:

cpp 复制代码
class Singleton {
public:
    static Singleton& getInstance() {
        if (!instance) {
            instance = new Singleton();
        }
        return *instance;
    }

    // 删除拷贝构造函数和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() {}  // 私有构造函数
    ~Singleton() {} // 私有析构函数

    static Singleton* instance; // 静态实例指针
};

Singleton* Singleton::instance = nullptr; // 初始化静态成员

线程安全版本(使用双重检查锁定):

cpp 复制代码
#include <mutex>

class Singleton {
public:
    static Singleton& getInstance() {
        if (!instance) {
            std::lock_guard<std::mutex> lock(mutex);
            if (!instance) {
                instance = new Singleton();
            }
        }
        return *instance;
    }

    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() {}
    ~Singleton() {}

    static Singleton* instance;
    static std::mutex mutex;
};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
  1. 饿汉式(Eager Initialization)
    饿汉式单例在程序启动时即创建实例,线程安全。
cpp 复制代码
class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 静态局部变量,程序启动时初始化
        return instance;
    }

    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() {}
    ~Singleton() {}
};
  1. Meyer's Singleton(静态局部变量)
    这是C++中最简洁的单例实现方式,利用了静态局部变量的特性(线程安全且懒加载)。
cpp 复制代码
class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 静态局部变量,线程安全且懒加载
        return instance;
    }

    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() {}
    ~Singleton() {}
};
相关推荐
C++ 老炮儿的技术栈5 分钟前
Ubuntu root账号自动登陆
linux·运维·服务器·c语言·c++·ubuntu·visual studio
Irissgwe35 分钟前
map/set/multimap/multiset 的底层逻辑与实现
数据结构·c++·算法·二叉树·stl·c·红黑树
(Charon)1 小时前
【C++ 面试高频:内存管理、RAII 和智能指针详解】
java·开发语言·word
凡人叶枫1 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
不想写代码的星星1 小时前
伪共享:逻辑无共享,物理打成狗
c++
轻刀快马1 小时前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理
gCode Teacher 格码致知2 小时前
Javascript技术:CSS 中rem、vh 和 px各有其最佳适用场景-由Deepseek产生
开发语言·javascript·css
noipp2 小时前
【无标题】
c语言·数据结构·c++·算法
森G2 小时前
64、完善聊天室程序(TLV拓展)---------网络编程
网络·c++·tcp/ip
超皮小龙猫2 小时前
c语言-1
c语言·开发语言