单例模式【每日一练】

本文详细介绍了单例模式的思想,包括其确保类只有一个实例并提供全局访问点的特性。文章讨论了两种实现方式,静态对象和动态分配,并分别阐述了各自的优缺点。文章还提供了多个C++实现单例模式的示例代码,如Singleton1到Singleton5,其中Singleton1作为推荐的静态局部对象实现方式。
摘要由CSDN通过智能技术生成

1. 思想

1.1 什么是单例模式

单例模式需要保证类只有唯一的实例,而且要满足两个要求:

  1. 线程安全
  2. 内存不泄露

1.2 实现方式

有两种方法可以实现,分别是 static 对象(数据存放在data 段)和 new 动态分配(存放在堆区)

  • static:静态对象的生命周期由编译器来管理,它直到程序结束时才会释放。而且在 C++11 及以后,static 创建的变量是线程安全的。
  • new:需要手动保证线程安全以及内存不泄露

下面给出两大类方法的具体实现:
Singleton1【推荐】:static 局部对象(懒汉)
Singleton2:static 数据成员(饿汉)
Singleton3:new + 双检锁(Double-Checked Locking Pattern)(懒汉)
Singleton4:new + 双检锁+(自定义内部类释放内存)(懒汉)
Singleton5【次之】:new + 双检锁+(智能指针+自定义deleter)(懒汉)

2. 算法代码

2.1 Singleton1

  • h
/**
 * @brief 使用 static 对象保证唯一单例,懒汉模式(使用到才构造)
 * 线程安全,无内存泄漏
 * 要求:C++11 及以后标准
*/
class Singleton1{
   
public:
    static Singleton1& getInstance();

public:
    // Rule of Three
    Singleton1(const Singleton1&) = delete;
    Singleton1& operator=(const Singleton1&) = delete;

private:
    Singleton1();
    ~Singleton1();
};
  • cpp
Singleton1::Singleton1(){
   
    cout<<"singleton1 create"<<endl;
}

Singleton1::~Singleton1(){
   
    cout<<"singleton1 delete"<<endl;
}

Singleton1& Singleton1::getInstance(){
   
    static Singleton1 instance_;
    return instance_;
}
  • h
class Singleton2{
   
public:
    static Singleton2& getInstance();

public:
    Singleton2(const Singleton2&) = delete;
    Singleton2& operator=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值