单例设计模式c++

ops/2025/3/5 10:35:30/

什么是单例模式?

单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性

单例模式分类

单例模式可以分为懒汉式饿汉式,两者之间的区别在于创建实例的时间不同

  • 懒汉式:指系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考虑线程安全)
  • 饿汉式:指系统一运行,就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)

单例类特点

  • 构造函数和析构函数为private类型,目的禁止外部构造和析构
  • 拷贝构造和赋值构造函数为private类型,目的是禁止外部拷贝和赋值,确保实例的唯一性

单例类的结构

  • 一个public的获取指向唯一的实例对象的指针的函数GetInstance()
  • 构造函数析构函数设为private,禁止外部构造和析构
  • 拷贝构造和赋值操作符重载函数设为private类型,禁止外部拷贝和赋值,确保实例的唯一性
  • 一个private的static的指向唯一的实例对象的指针

懒汉模式实现代码

线程不安全版本:


//线程不安全的懒汉模式
class singleClass {
public:static singleClass* getinstance()//对外的接口(方法),静态成员函数调用静态成员变量{if (instance == nullptr){instance = new singleClass();}return instance;};private:static singleClass* instance;//静态成员变量,类内声明,类外初始化singleClass() {} //构造函数属性设置为私有singleClass(const singleClass & sc) {} //拷贝构造函数也需要设置为私有
};
singleClass* singleClass::instance=nullptr;//初始化静态变量
//线程安全的懒汉模式
class lhsingleClass {
public:static lhsingleClass* getinstance(){//双重锁模式if (instance == nullptr){//先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回//进入后加锁i_mutex.lock();if (instance == nullptr){//再判断一次,确保不会因为加锁期间多个线程同时进入instance = new lhsingleClass();}i_mutex.unlock();//解锁}return instance;}
private:static lhsingleClass* instance;static mutex i_mutex;//锁lhsingleClass(){}lhsingleClass(const lhsingleClass& sc) {}//拷贝构造函数也需要设置为私有
};
lhsingleClass* lhsingleClass::instance=nullptr;
mutex lhsingleClass::i_mutex;//类外初始化

饿汉模式实现代码

//饿汉模式:不管用不用得到,都构造出来。本身就是线程安全的
class ehsingleClass {
public:static ehsingleClass* getinstance(){return instance;}private:static ehsingleClass* instance;//静态成员变量必须类外初始化,只有一个ehsingleClass() {}
};
ehsingleClass* ehsingleClass::instance = new ehsingleClass();
//类外定义,main开始执行前,该对象就存在了


http://www.ppmy.cn/ops/15631.html

相关文章

vue实现光标插入模板和删除指定模板内容

需求&#xff1a; 文本可插入模板文字&#xff1b;同时在“%虚拟机名称%”后一个%删除,会将“%虚拟机名称%”选中删除 以下代码可以直接复制使用&#xff1a; <template><div><div><b>需求&#xff1a;</b> <br> 文本可插入模板文字&am…

FinalShell 安装 及使用教程

一 简介&#xff1a; FinalShell 是一款免费的国产的集 SSH 工具、服务器管理、远程桌面加速的良心软件&#xff0c;同时支持 Windows,macOS,Linux&#xff0c;它不单单是一个 SSH 工具&#xff0c;完整的说法应该叫一体化的的服务器&#xff0c;网络管理软件&#xff0c;在很…

深度学习中的黑科技:自监督学习(Self-Supervised Learning)

在人工智能领域&#xff0c;深度学习已成为推动技术革新的核心力量。然而&#xff0c;深度学习的一个重要瓶颈是对大量标记数据的依赖性。在这个背景下&#xff0c;自监督学习(Self-Supervised Learning, SSL)作为一种新兴的学习范式&#xff0c;越来越受到研究者的关注。自监督…

Pandas 2.2 中文官方教程和指南(九·二)

比较类似数组的对象 当将 pandas 数据结构与标量值进行比较时&#xff0c;您可以方便地执行逐元素比较&#xff1a; In [65]: pd.Series(["foo", "bar", "baz"]) "foo" Out[65]: 0 True 1 False 2 False dtype: boolIn …

【Xilinx】时序约束学习 TIMING-1: 时钟修改块上的时钟波形无效

在 <cell_type> 输出 <pin_name> 上指定的时钟 <clock_name> 的时钟波形无效&#xff0c; 与时钟修改块 (CMB) 设置不匹配。该时钟波形为 <VALUE>。期望的波形为 <VALUE>。 描述 Vivado Design Suite 会根据 CMB 设置和传入主时钟的特性&#xf…

ArrayList

一.简介 在集合框架中&#xff0c;ArrayList是一个普通的类&#xff0c;实现了List接口&#xff0c;具体框架如下 说明&#xff1a; 1.ArrayList是以泛型方式实现的&#xff0c;使用时必须先实例化 2.ArrayList实现了RandomAccess接口&#xff0c;表明ArrayList支持随机访问…

在windows系统中安装kafka配置全步骤记录

在windows系统中安装kafka配置全步骤记录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可…

ETLCloud中多并行分支运行的设计技巧

在大数据处理领域&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;流程是至关重要的一环&#xff0c;它涉及数据的提取、转换和加载&#xff0c;以确保数据的质量和可用性。而在ETL流程中&#xff0c;多并行分支的运行设计是一项关键技巧&#xff0c;可以有效…