1、单例模式:

单例模式:用来创建独一无二的,只能够有一个实例的对象。 单例模式的结构是设计模式中最简单的,但是想要完全实现一个线程安全的单例模式还是有很多陷阱的。

2、应用场景:

共享数据或者共享访问点;
创建一个对象需要消耗的资源过多,如访问IO和数据库等资源;
需要定义大量的静态常量和静态方法(工具类)

单例模式的应用场景:有一些对象其实只需要一个,比如:windows Task Manager (任务管理器)、windows 回收站、线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象、充当打印机、显卡等设备的驱动程序对象。这些对象只能够拥有一个实例,如果创建出了多个实例,就会导致一些程序的问题。程序的行为异常,资源使用的过量,或者导致不一致的结果。常用来管理共享的资源,比如数据库的连接或者线程池。

3、优缺点:

优点:一个实例,减少内存开销;减少系统开销;避免对一个资源的多重占用;设置全局访问点,优化和贡献资源。

缺点:没有借口,扩展性差;不利于测试;与单一职责原则有冲突,单例模式把“要单例”和业务逻辑融合在一个类中。

4、实现

1、经典实现(线程不安全)

class Singleton
{ public: static Singleton* getInstance(); protected: Singleton(){} private: static Singleton *p;
}; Singleton* Singleton::p = NULL;
Singleton* Singleton::getInstance()
{ if (NULL == p) p = new Singleton(); return p;
}
1、当两个线程运行至if(instance==NULL)时,可能产生线程安全问题。改进:在用到的时候在初始化,这样程序效率比较高,但是有一个另外比较好的方法可以采用是提前初始化,将Instance设置为static之后直接初始化为Singleton对象,每次只需要执行返回操作即可。class Singleton {
public:static Singleton* getInstance();protected:Singleton();private:static Singleton *instance;
};//对单例直接进行初始化,而不再方法Instance中进行判断。Singleton* Singleton::instance = new Singleton;Singleton* Singleton::getInstance(){return instance;}
这样的话同样会导致问题,就是如果单例本来资源比较多,但是不需要创建那么早,就会消耗资源~2、另外一种提升因为同步导致的性能变差的方法称为“双重检验加锁”。方法如下:class Singleton {
public:static Singleton* getInstance();
protected:Singleton();
private:static Singleton* instance;
}Singleton *Singleton::instance = NULL;
Singleton* Singleton::getInstance() {//check 之前进行临界区加锁操作//双重检验加锁if(_instance == NULL ) {lock();if( instance == NULL) {instance = new Singleton();}Unlock();}return _instance;
}思路是只有在第一次创建的时候进行加锁,当instance不为空的时候就不需要进行加锁的操作,这样就可以提升性能~

2、懒汉模式与饿汉模式

懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,所以上边的经典方法被归为懒汉实现;

饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。
特点与选择

区别:由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。在访问量较小时,采用懒汉实现。这是以时间换空间。

1.加锁实现线程安全的懒汉模式class Singleton
{ public: static pthread_mutex_t mutex; static Singleton* getInstance(); protected: Singleton() { pthread_mutex_init(&mutex); } private: static Singleton* p;
}; pthread_mutex_t Singleton::mutex;
Singleton* Singleton::p = NULL;
Singleton* Singleton::getInstance()
{ if (NULL == p) { pthread_mutex_lock(&mutex); if (NULL == p) p = new Singleton(); pthread_mutex_unlock(&mutex); } return p;
}2.内部静态变量实现懒汉模式class Singleton
{ public: static pthread_mutex_t mutex; static Singleton* getInstance(); protected: Singleton() { pthread_mutex_init(&mutex); }
}; pthread_mutex_t Singleton::mutex;
Singleton* Singleton::getInstance()
{ pthread_mutex_lock(&mutex); static singleton obj; pthread_mutex_unlock(&mutex); return &obj;
}

饿汉模式class Singleton
{ public: static Singleton* getInstance(); protected: Singleton(){} private: static Singleton* p;
}; Singleton* Singleton::p = new Singleton;
Singleton* Singleton::getInstance()
{ return p;
} 

设计模式之单例模式(C++代码实现)相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  3. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  4. 【Python】Python语言学习:设计模式、单例模式

    01 设计模式 1.1 设计模式简介 设计模式是解决特定问题的解决方案. 设计模式的优点: 1 可以在多个项目重复使用. 2 问题可以在架构级别来解决. 3 经过了时间的验证和良好的证明,是开发人员和 ...

  5. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  6. 设计模式 之 单例模式

    项目源码:https://gitee.com/Jacob-gitee/DesignMode 个人博客:https://jacob.org.cn 宗旨     Ensure a class has on ...

  7. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  8. socket可以写成单例嘛_精读设计模式 Singleton 单例模式

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  9. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

  10. 设计模式之--单例模式

    序言 今天,我会来详细的讲解二十三种设计模式中最常见的设计模式--单例模式,包括单例模式的特点,应用常见,单例模式使用的好处,以及单例模式实现的方式,以及每个方式之间的优缺点等. 好了,话不多说了,让 ...

最新文章

  1. 【精致Java教程】02:Java的跨平台原理
  2. JSON asp(vbs)中文支持问题
  3. 【计算机网络】HTTP 与 HTTPS ( HTTP 在网络各个层级的传输过程 | HTTPS 工作流程 | HTTPS 弊端 )
  4. mysql 多列索引的生效规则
  5. JAVA学习篇--JSP实现原理
  6. 一个Java多线程的问题,颠覆了我多年的认知!
  7. 逆clarke变换_是clarke变换还是clark
  8. 优化器是怎么得到执行计划的?
  9. 腾讯极客挑战赛邀你“码上种树”
  10. java split函数报错
  11. MySQL深度剖析之数据在磁盘上存储(2021)
  12. 随手记一个漂亮的code
  13. 解决Conda install tensorflow弹窗Python.exe已经停止工作的问题
  14. Linux环境下安装Hadoop(完全分布式)
  15. CAM365|超高性价比CAM软件推荐
  16. 阿里巴巴日志处理系统
  17. Boxy vehicle detection 数据集
  18. 软件测试周刊(第82期):其实所有纠结做选择的人心里早就有了答案,咨询只是想得到内心所倾向的选择。
  19. ChunJun Meetup演讲分享 | 基于袋鼠云开源框架的数仓一体化建设探索
  20. [zt]给你的Mp4大换血,精选Touch里3年收集的900多首歌,经典不忍去的最新近流行的,与你共享~~...

热门文章

  1. 1118. Birds in Forest (25)
  2. android界面的滑动切换功能
  3. 给你这张图,你能搜索到来历吗
  4. Linux 文件系统编程之系统调用和标准I/O库
  5. Android开发 - 掌握ConstraintLayout(一)传统布局的问题
  6. Golang 特性简介
  7. SpringJDBC解析3-回调函数(update为例)
  8. QQuickRenderControl
  9. 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理
  10. 关于数据库查询优化的思考