设计模式:单例模式

设计模式:单例模式

单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供了一个全局访问点。在C++中,实现单例模式可以采用饿汉模式或懒汉模式,每种模式都有其适用的场景和特点。

1. 饿汉模式 (Eager Initialization)

在饿汉模式中,单例实例在程序启动时就被创建,无论之后是否会被用到。

饿汉模式的单例类
class SingletonEager {
public:
    // 获取唯一实例的静态方法
    static SingletonEager& getInstance() {
        // 在静态成员变量中保持单例实例
        static SingletonEager instance;
        return instance;
    }

    // 禁止拷贝构造和赋值运算符
    SingletonEager(const SingletonEager&) = delete;
    SingletonEager& operator=(const SingletonEager&) = delete;

private:
    // 私有构造函数,确保无法从外部创建新实例
    SingletonEager() {}
};

特点和适用场景:

  • 线程安全性: 饿汉模式天生是线程安全的,因为实例在静态成员变量中定义,并且在程序启动时就创建。
  • 资源消耗: 由于实例在程序启动时即被创建,因此可能会造成不必要的资源浪费,尤其是在实例初始化较为复杂或耗时的情况下。

适用场景:

  • 实例初始化简单且轻量,且在整个程序运行周期内始终被使用。
  • 需要保证线程安全,但又不想在每次访问时都进行加锁操作。
2. 懒汉模式 (Lazy Initialization)

懒汉模式下,单例实例在首次被请求时才被创建。

// 懒汉模式的单例类
class SingletonLazy {
public:
    // 获取唯一实例的静态方法
    static SingletonLazy& getInstance() {
        // 使用双检锁确保线程安全
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mutex);  // 加锁
            if (instance == nullptr) {
                instance = new SingletonLazy();
            }
        }
        return *instance;
    }

    // 禁止拷贝构造和赋值运算符
    SingletonLazy(const SingletonLazy&) = delete;
    SingletonLazy& operator=(const SingletonLazy&) = delete;

private:
    // 私有静态成员变量指针,初始化为nullptr
    static SingletonLazy* instance;
    static std::mutex mutex;  // 用于保证线程安全的互斥量

    // 私有构造函数,确保无法从外部创建新实例
    SingletonLazy() {}
};

// 静态成员变量初始化
SingletonLazy* SingletonLazy::instance = nullptr;
std::mutex SingletonLazy::mutex;

特点和适用场景:

  • 延迟加载: 懒汉模式仅在需要时才创建实例,节省了资源和初始化时间。
  • 线程安全性: 使用双检锁(double-checked locking)确保在多线程环境下仍能保持高效和线程安全。
  • 资源消耗: 首次访问时的初始化开销可能会影响性能,特别是在高并发环境中。

适用场景:

  • 实例初始化开销较大,不一定在程序运行的每个阶段都被用到。
  • 需要延迟加载以节省资源,或者在实例初始化时有复杂的逻辑处理。
使用单例模式的示例:
int main() {
    // 使用饿汉模式获取单例实例
    SingletonEager& instance1 = SingletonEager::getInstance();

    // 使用懒汉模式获取单例实例
    SingletonLazy& instance2 = SingletonLazy::getInstance();

    return 0;
}

在实际应用中,根据具体的需求和性能要求选择合适的单例模式实现。饿汉模式适合于实例初始化开销较小且始终会被使用的情况,而懒汉模式则适用于实例初始化开销较大或可能不被使用的情况。

相关推荐

  1. 设计模式

    2024-07-11 21:46:06       59 阅读
  2. 设计模式

    2024-07-11 21:46:06       37 阅读
  3. 设计模式

    2024-07-11 21:46:06       37 阅读
  4. 设计模式

    2024-07-11 21:46:06       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 21:46:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 21:46:06       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 21:46:06       58 阅读
  4. Python语言-面向对象

    2024-07-11 21:46:06       69 阅读

热门阅读

  1. BP神经网络与反向传播算法在深度学习中的应用

    2024-07-11 21:46:06       22 阅读
  2. Ubuntu 打开或关闭界面

    2024-07-11 21:46:06       18 阅读
  3. c++状态机实现示例

    2024-07-11 21:46:06       23 阅读
  4. Mac上pyenv的安装及使用

    2024-07-11 21:46:06       18 阅读
  5. 【C++】智能指针

    2024-07-11 21:46:06       24 阅读
  6. 【TS】Typescript 的类

    2024-07-11 21:46:06       23 阅读
  7. 说一下浏览器中的强缓存和协商缓存的区别

    2024-07-11 21:46:06       24 阅读
  8. 【Redis 如何实现分级缓存】

    2024-07-11 21:46:06       20 阅读
  9. Rust开发环境搭建

    2024-07-11 21:46:06       24 阅读