博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 -- 单例模式
阅读量:5164 次
发布时间:2019-06-13

本文共 1466 字,大约阅读时间需要 4 分钟。

一、单例模式概念

在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个访问它的全局访问点。

1、为什么要使用单例模式

  • 1.在整个程序空间使用全局变量,共享资源;
  • 2.大规模系统中,为了性能的考虑,需要节省对象的创建时间等等;
  • 3.在多个线程之间,共享同一个资源或者操作同一个对象;

2、现单例常用步骤

  • 1.构造函数private/protected
  • 2.提供一个全局的静态方法(全局访问点)
  • 3.在类中定义一个静态指针,指向本类的变量的静态变量指针

3、常见单例模式分类

     实例初始化时间的不同,可以分为:饿汉式单例和懒汉式单例

  • 1.饿汉式单例:静态初始化的方式,它是类一加载就实例化的对象,需要提前占用系统资源;
  • 2.懒汉式单例:在第一次被引用时才会将自己实例化;存在多线程问题。

 

二、常见单例方式

1、懒汉模式 -- 经典

(1)不适合于在多线程的情况下创建单件对象

(2)不适合于需要在程序结束的时候调用具体类的析构函数

 

2、懒汉模式 – 经典 – 加锁

线程不安全,怎么办?最直观的的办法:加锁。但是这样每次调用GetInstance()方法都需要Lock,会成为性能瓶颈。如何改进?

 

3、懒汉模式 – 双检锁模式

1.为什么要两次判空?

a)第一次判空,如果m_pSingleton存在,就直接返回了;

b)pSingleton=NULL并且同时有两个线程调用GetInstance()时,它们都可以通过第一次判空,然后由于Lock机制,只有一个线程进入,另一个在排队等待;如果没有第二次判空,那么两个都有可能创建实例

 

4、饿汉模式

类加载就实例化的对象,所以保证了线程安全,在性能要求比较高时,就可以使用这种方式,从而避免频繁的加锁和解锁造成的资源浪费。

饿汉的实现是有隐患的,因为c++中对全局对象的构造顺序并没有明确的规定。假如有一个全局对象A 构造函数里引用上文中饿汉形式的指针,若在A构造函数构造之前以上单例并未构造出来,那就会有问题。

 

5、饿汉模式 -- 静态变量

因为静态初始化在程序开始时,也就是进入main函数之前,由主线程以单线程方式完成了初始化,所以静态初始化实例保证了线程安全性。在性能要求比较高时,就可以使用这种方式,从而避免频繁的加锁和解锁造成的资源浪费。注意:禁止类拷贝和类赋值。

 

6、其他问题:内存是否需要释放?

因为生命期与主线程相同的对象,程序退出,系统会回收所有资源,包括没有delete的。或者在单例中实现一个private的Cgarbo:

7、单例模式与静态方法的比较

1、单例可以继承类,实现接口,而静态类不能;

2、单例可以被延迟初始化,静态类一般在第一次加载时初始化;

3、单例类可以被用于多态而无需强迫用户只假定唯一的实例,不过一般不用这种方法,直接用模板实现单例比较省事!

4.单例模式执行的时候需要new 一个对象出来存储在堆里面,而静态方法不需要,它不依赖于对象(没有this指针),但是他也是需要内存的,存储在静态存区;

5.静态方法的类会在代码编译的时候就被加载,静态方法中产生的对象,会随着静态方法执行完毕而释放掉,而且执行类中的静态方法时,不会实例化静态方法所在的类。如果用单例模式, 产生的那一个唯一的实例,会一直在内存中,不会被GC清除的(原因是静态的属性变量不会被GC清除),除非程序退出了;

 

参考:大话设计模式

转载于:https://www.cnblogs.com/yzdai/p/9783184.html

你可能感兴趣的文章
Linux 下源码编译安装 vim 8.1
查看>>
【C++】三大概念要分清--重载,隐藏(重定义,覆盖(重写)
查看>>
Condition原理以及使用
查看>>
[转]JQuery实现图片轮播效果
查看>>
记一次nginx部署yii2项目时502 bad gateway错误的排查
查看>>
算法-插入排序(Insertion sorting)
查看>>
python字典
查看>>
常用window命令
查看>>
Python命名空间和作用域
查看>>
前端效果——持续更新。。。
查看>>
开发和常用工具推荐清单
查看>>
(排序)快速排序QuickSort
查看>>
[asp.net]登录协同工作平台安全解决方式
查看>>
看到一篇很有意思的文章:在中国,电商赚钱的原因是穷人太多。
查看>>
WP7.1 应用程序发布到Marketplace
查看>>
04-Spring的注解开发
查看>>
微信小程序之登录态维护(十一)
查看>>
Linux卸载MySql——ubuntu版
查看>>
【转自心声】华为眼中管理者的18种惰怠行为
查看>>
云与备份之(1):VMware虚机备份和恢复
查看>>