当前位置: 首页 > news >正文

C++设计模式--单例模式

单例模式的学习笔记
单例模式是为了:在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性
参见链接1,链接2

#include <iostream>
#include <mutex>using namespace std;/*懒汉模式:只有在用到了才实例化对象并返回(调用了对外的接口才会实例对象)*/
/*构造函数私有化,只对外提供一个接口*//*线程不安全*/
class singleClass {
public:static singleClass* getInstance() // 对外接口,静态成员函数调用静态成员变量{if (m_instance == nullptr)  // 在多线程的环境下,在判空的时候可能存在多个线程同时进入if中,此时可能会实例化多个对象{m_instance = new singleClass();}return m_instance;}private:static singleClass* m_instance;  // 静态成员变量,类内声明,类外初始化singleClass() {}    // 构造函数属性设置为私有singleClass (const singleClass & sc) {}  // 拷贝构造函数也设置为私有
};singleClass* singleClass::m_instance = nullptr;   // 初始化静态变量/*线程安全*/
class threadSingleClass
{
public:static threadSingleClass* getInstance(){if (m_instance == nullptr)   // 先判断是否为空,为空就进入;不为空,说明已经存在实例,返回{//m_mutex.lock();   // 这里如果使用unique_lock就不需要在下面解锁unique_lock<mutex> lock(m_mutex);if (m_instance == nullptr)   // 再次判断,确保不会因为加锁期间多个线程同时进入{m_instance = new threadSingleClass();}//m_mutex.unlock();}return m_instance;}private:static threadSingleClass* m_instance;static mutex m_mutex;threadSingleClass() {};threadSingleClass(const threadSingleClass& sc) {}
};threadSingleClass* threadSingleClass::m_instance = nullptr;
mutex threadSingleClass::m_mutex;/*饿汉模式:不管调不调用对外接口,都已经实例化对象了。本身就是线程安全的*/
/*类在加载的时候就实力化对象,所以要提前占用系统资源*/
class hungrySingleClass
{
public:static hungrySingleClass* getInstance(){return m_instance;}private:static hungrySingleClass* m_instance;hungrySingleClass() {}hungrySingleClass(const hungrySingleClass* sc) {}  // 拷贝构造私有
};hungrySingleClass* hungrySingleClass::m_instance = new hungrySingleClass();
// 类外定义,main开始执行前,该对象就存在了int main()
{singleClass* singlep1 = singleClass::getInstance();singleClass* singlep2 = singleClass::getInstance();cout << singlep1 << endl;cout << singlep2 << endl;threadSingleClass* thsinglep1 = threadSingleClass::getInstance();threadSingleClass* thsinglep2 = threadSingleClass::getInstance();cout << thsinglep1 << endl;cout << thsinglep2 << endl;hungrySingleClass* hgsinglep1 = hungrySingleClass::getInstance();hungrySingleClass* hgsinglep2 = hungrySingleClass::getInstance();cout << hgsinglep1 << endl;cout << hgsinglep2 << endl;system("pause");return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java人力资源招聘社会校招类型招聘系统PC端
  • Linux服务管理(四)Apache服务
  • <Python><paddle>基于python使用百度paddleocr实现车牌识别
  • Vue2从基础到实战(指令修饰符)详解
  • Golang | Leetcode Golang题解之第290题单词规律
  • 便携移动工作站,端侧 AI 大模型设备折腾笔记:ROG 幻 X 和 4090 扩展坞
  • Python常用内置库介绍
  • Redis学习[3] ——持久化
  • android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion
  • Python基础知识笔记——random模块
  • C++包管理之`vcpkg`简介
  • 如何限制 docker 使用cpu
  • HTML中a标签跳转后路径不正确?
  • IDEA 本地有jar包依赖文件,但是所有引用的jar包全部爆红
  • 【ROS 最简单教程 002/300】ROS 集成开发环境安装 (虚拟机版): Noetic
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Apache的80端口被占用以及访问时报错403
  • Date型的使用
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • exif信息对照
  • Python打包系统简单入门
  • SpingCloudBus整合RabbitMQ
  • vue-loader 源码解析系列之 selector
  • 测试开发系类之接口自动化测试
  • 记一次和乔布斯合作最难忘的经历
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 区块链技术特点之去中心化特性
  • 我有几个粽子,和一个故事
  • 因为阿里,他们成了“杭漂”
  • scrapy中间件源码分析及常用中间件大全
  • 阿里云ACE认证学习知识点梳理
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 回归生活:清理微信公众号
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #70结构体案例1(导师,学生,成绩)
  • (4)logging(日志模块)
  • (a /b)*c的值
  • (翻译)terry crowley: 写给程序员
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (六)软件测试分工
  • (每日一问)基础知识:堆与栈的区别
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)JPA - JQPL 实现增删改查
  • (四)汇编语言——简单程序
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)winform之ListView
  • .NET C# 配置 Options
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core 项目指定SDK版本
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET的数据绑定