用C++实现单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类在整个应用程序中仅有一个实例,并提供一个全局访问点来获取这个实例。这种模式常用于那些需要频繁创建且消耗资源较多的对象,或者需要控制对共享资源访问的场景,比如数据库连接池、线程池、配置管理器等。

特点

  1. 唯一性:确保一个类只有一个实例。
  2. 全局访问:提供一个全局访问点,让其他对象可以容易地访问到这个实例。
  3. 延迟初始化:通常直到第一次使用时才创建实例,即所谓的懒加载,以节省资源。

实现要点

  1. 私有构造函数:防止外部直接创建实例。
  2. 静态私有实例变量:存储唯一实例。
  3. 公有的静态访问方法:提供获取唯一实例的方法。

在C++中实现单例模式,可以采用多种方式,这里我将展示几种常见的实现方法,包括饿汉式、懒汉式(含双重检查锁定)、以及静态内部类方式(C++中没有直接的静态内部类,但可以通过命名空间或者嵌套类模拟)。请注意,C++11及以后版本提供了更强大的线程支持,因此在实现时可以利用原子操作等现代C++特性来确保线程安全性。

  1. 饿汉式
    饿汉式在类加载时就完成了初始化,线程安全且简单直接,但可能会提前占用资源。
class Singleton {
public:
    static Singleton& getInstance() {
        return instance;
    }

private:
    Singleton() {} // 私有构造函数
    ~Singleton() {} // 私有析构函数防止外部delete
    Singleton(const Singleton&) = delete; // 禁止拷贝构造
    Singleton& operator=(const Singleton&) = delete; // 禁止赋值运算符

    static Singleton instance; // 静态实例
};

// 初始化静态成员
Singleton Singleton::instance;
  1. 懒汉式 + 双重检查锁定
    懒汉式在首次使用时才初始化实例,双重检查锁定进一步优化了并发性能。
#include <mutex>

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

private:
    Singleton() {} // 私有构造函数
    ~Singleton() {} // 私有析构函数
    Singleton(const Singleton&) = delete; // 禁止拷贝构造
    Singleton& operator=(const Singleton&)赋值运算符

    static Singleton = delete; // 禁止* instance_; // 静态指针实例
    static std::mutex mutex_; // 互斥锁
};

// 初始化静态成员
Singleton* Singleton::instance_ = nullptr;
std::mutex Singleton::mutex_;
  1. 静态局部变量方式(模拟静态内部类)
    C++没有静态内部类的概念,但可以通过命名空间或者嵌套类加静态局部变量的方式模拟实现。
class Singleton {
public:
    static Singleton& getInstance() {
        return Nested::instance;
    }

private:
    Singleton() {} // 私有构造函数
    ~Singleton() {} // 私有析构函数
    Singleton(const Singleton&) = delete; // 禁止拷贝构造
    Singleton& operator=(const Singleton&) = delete; // 禁止赋值运算符

    class Nested {
    public:
        static Singleton instance;
    };

    friend class Nested;
};

// 静态局部变量在第一次使用时初始化,且线程安全(C++11标准保证)
Singleton Singleton::Nested::instance;

以上展示了C++中实现单例模式的几种方式,每种方式都有其适用场景和优缺点,开发者应根据实际需求选择最合适的实现。

相关推荐

  1. C++实现模式

    2024-04-29 03:12:01       32 阅读
  2. C++ 实现模式

    2024-04-29 03:12:01       50 阅读
  3. C++实现模式

    2024-04-29 03:12:01       34 阅读
  4. C#模式的简单实现

    2024-04-29 03:12:01       53 阅读
  5. C++模式实现

    2024-04-29 03:12:01       50 阅读

最近更新

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

    2024-04-29 03:12:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 03:12:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 03:12:01       87 阅读
  4. Python语言-面向对象

    2024-04-29 03:12:01       96 阅读

热门阅读

  1. MySQL

    MySQL

    2024-04-29 03:12:01      35 阅读
  2. kafka 线上消费积压问题

    2024-04-29 03:12:01       33 阅读
  3. Gitea 的简单介绍

    2024-04-29 03:12:01       32 阅读
  4. css如何去掉重叠部分的边框,CSS中nth-child不生效

    2024-04-29 03:12:01       30 阅读
  5. C++--

    C++--

    2024-04-29 03:12:01      32 阅读
  6. 分布式架构搭建

    2024-04-29 03:12:01       34 阅读