用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++中实现单例模式的几种方式,每种方式都有其适用场景和优缺点,开发者应根据实际需求选择最合适的实现。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值