2021-05-13

单例模式

单例模式:属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)。

如何让类有且仅有一个实例对象?

类对象的实例化是通过构造函数拷贝构造函数产生的,要想让类对象有且仅有一个实例化对象,构造函数拷贝构造函数的属性必不可能为public(即private)。

下面这个是最推荐的单例模式--局部静态变量

可能很多基础不太好的看不懂,解释一下就明白了:

1,static修饰类的成员函数,此函数不在为类对象的成员函数而是类的成员函数。

2,static修饰局部变量变为局部静态变量,作用域是函数体内从定义开始到函数结束,但是并没有被销毁(存储在静态存储区),函数再次被调用,仍然可以看到它。

看一下几个有缺陷的单例模式

有缺陷的懒汉式(Lazy-Initialization),方法是直到使用时才实例化对象,也就说直到调用getObject() 方法的时候才 new 一个单例的对象, 如果不被调用就不会占用内存。

从图上可以看出,这种方式造成了内存泄漏(直到程序结束都没能执行析构函数释放申请到的内存),解决内存泄露的办法是在主函数底部添加delete p1,除此之外不要疑惑为啥类的静态成员为啥在类外初始化:

static const int count = 0; //静态成员常量需要在类内初始化。
static int count; //静态变量需要在类外初始化。

懒汉模式改进(线程安全,内存安全的懒汉模式):

看到这,可能有人问,为啥析构函数当到public里面了,原因是用智能指针share_ptr<Singleton>申请了一个对象,必须在程序结束的时候执行析构函数。

总结:最简单安全的方式还是局部静态变量的单例模式,内存和线程安全的懒汉模式看虽然也能达到一样的程度,但是就代码复杂度来说不容易维护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值