c++设计模式

单例模式

若有class A,整个程序中保证A类只有一个对象。
1.为了保证只有一个实例,那么就不能让A类随意创建对象,也就不能调用构造函数,那么就需要把构造函数私有化
2.需要私有的静态当前类的指针成员变量
私有:保证无法在类外对成员变量进行操作。
静态:保证类的对向只有一个。
3.需要一个函数GetInstance()来返回单例模式的对象,因为构造函数私有化所以无法在类外构造对象。那么GetInstance()函数就作为静态接口,直接通过类名来调用函数。由于静态函数只能调用静态变量,因此A类中的成员变量也需要是静态。由于成员变量是静态的,所以要在类外进行初始化。
4.**对象释放的问题:**由于单例模式只有一个对象,所以占用内存很少,不用专门释放内存,等到程序结束后系统将所有内存回收即可。

懒汉模式

第一次调用获取实例的函数GetInstance()时才创建对象。

//懒汉模式
class SingletonLazy{
private://1.构造函数私有化SingletonLazy(){}//2.私有的静态当前类的指针成员变量static SingletonLazy* pSingleton;public://3.获取对象的静态接口static SingletonLazy* GetInstance(){if(pSingleton == nullptr){pSingleton = new SingletonLazy;}return pSingleton;}
};
SingletonLazy* SingletonLazy::pSingleton = nullptr;

饿汉模式

直接在类外初始化对象时直接创建。在main函数执行之前就已经创建好对象。

//饿汉模式
class SingletonHungry{
private://1.构造函数私有化SingletonHungry(){}//2.私有的静态当前类的指针成员变量static SingletonHungry* pSingleton;public://3.获取对象的静态接口static SingletonHungry* GetInstance(){return pSingleton;}
};
SingletonHungry* SingletonHungry::pSingleton = new SingletonHungry;

单例模式遇到多线程

1.懒汉模式在GetInstance函数中创建对象,那么如果多线程同时调用GetInstance函数时,那么线程不安全。
2.饿汉模式在main函数执行前就已经创建好了对象,就不会同时对单例对对象进行操作,所以线程安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机毕设选题推荐】幼儿园管理系统SpringBoot+SSM+Vue

前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的幼儿园管理系统 技术栈 SpringBootSSMVueMySQLMaven 文章目录 一、幼儿园管…

删除有序数组的重复项-------题解报告

题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题解: 个人的想法比较粗糙,因为是递增数组,所以如果有相同的数组,必然相邻,所以只需要判断相邻元素是否相等,相…

【Docker 内核详解】namespace 资源隔离(四):Mount namespace Network namespace

【Docker 内核详解 - namespace 资源隔离】系列包含: namespace 资源隔离(一):进行 namespace API 操作的 4 种方式namespace 资源隔离(二):UTS namespace & IPC namespacenamespace 资源隔…

自定义Flink kafka连接器Decoding和Serialization格式

前言 使用kafka连接器时: 1.作为source端时,接受的消息报文的格式并不是kafka支持的格式,这时则需要自定义Decoding格式。 2.作为sink端时,期望发送的消息报文格式并非kafka支持的格式,这时则需要自定义Serializati…

python中使用xml.dom.minidom模块读取解析xml文件

python中可以使用xml.dom.minidom模块读取解析xml文件 xml.dom.minidom模块应该是内置模块不用下载安装 对于一个xml文件来说比如这个xml文件的内容为如下 <excel version"1.0" author"huangzhihui"><table id"1"><colum id&qu…

第四节(1):EXCEL中判断一个WORD文件是否被打开

《VBA信息获取与处理》教程(10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网…

控制一个游戏对象的旋转和相机的缩放

介绍 这段代码是一个Unity游戏开发脚本&#xff0c;它用于控制一个游戏对象的旋转和相机的缩放。以下是代码的主要功能&#xff1a; 控制游戏对象的旋转&#xff1a; 通过按下Q键和W键&#xff0c;用户可以选择以逆时针或顺时针方向绕游戏对象的Y轴进行旋转。旋转角度和速度可…

js中nan有什么用,如何判断

在JavaScript中&#xff0c;NaN表示“不是一个数字”&#xff0c;当一个数值无法被解析为数字时会返回NaN。NaN通常表示一个错误的或非法的数值操作结果。例如&#xff0c;当尝试将非数字字符串解析为数字时&#xff0c;将返回NaN。 NaN具有以下特点&#xff1a; NaN不等于任何…

shell命令以及运行原理

Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。 而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来与kernel沟通。如何理解&a…

Ubuntu 20.04装机

安装搜狗输入法&#xff1a; Ubuntu 20.04安装sogou输入法_ubuntu20.04 搜狗输入法-CSDN博客a 安装chrome浏览器&#xff1a; ubuntu20.04安装Chrome浏览器-CSDN博客 安装nvidia驱动 ubuntu20安装nvidia驱动-CSDN博客 安装cudnn ubuntu 20 安装 CUDA-CSDN博客

【LeetCode】22. 括号生成

1 问题 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&#xff1a; 输…

rabbitMQ的知识点

RabbitMQ是一种消息队列软件&#xff0c;它实现了高度可靠的消息传递机制。RabbitMQ支持多种消息协议&#xff0c;包括AMQP、STOMP、MQTT等&#xff0c;比较灵活。以下是一些rabbitmq的知识点&#xff1a; 1. 消息队列&#xff1a;消息队列是一种分布式系统中广泛使用的通信模…

ESP32-IPS彩屏ST7789-Arduino-简单驱动

目的&#xff1a; 使ESP32能够驱动点亮ST7789显示屏 前提条件&#xff1a; ESP32 ST7789 &#xff08;240 x240&#xff0c;IPS&#xff09; 杜邦线 Arduino 过程&#xff1a; 0x00--接线 0x01--驱动&#xff1a; 彩屏驱动库 针对不同的彩屏驱动芯片&#xff0c;常用的 Arduino…

Go实现CORS(跨域)

引言 很多时候&#xff0c;需要允许Web应用程序在不同域之间&#xff08;跨域&#xff09;实现共享资源。本文将简介跨域、CORS的概念&#xff0c;以及如何在Golang中如何实现CORS。 什么是跨域 如果两个 URL 的协议、端口&#xff08;如果有指定的话&#xff09;和主机都相…

Linux性能优化--实用工具:性能工具助手

8.0 概述 本章介绍一些在Linux系统上可用的实用程序&#xff0c;它们能够加强性能工具的有效性和可用性。实用工具本身不是性能工具&#xff0c;但是当它们与性能工具一起使用时&#xff0c;它们可以帮助完成如下功能&#xff1a;自动执行繁琐的任务、分析性能统计数据&#x…

资源受限MCU Flash空间占用优化

资源受限MCU Flash空间占用优化步骤&#xff1a; 避免重复功能&#xff0c;排查软件工程中&#xff0c;重复功能的代码片段&#xff0c;抽象出来&#xff0c;重新进行封装&#xff1b;减少内联函数inline&#xff0c;内联函数过大且过多的调用无疑会增加代码量&#xff0c;占用…

二叉树的三种遍历方式的本质

二叉树的定义就不在这里多说了&#xff0c;下面这个图就是一个简单的二叉树&#xff1a; 二叉树的三种遍历方式&#xff1a; 前序遍历&#xff1a;头左右&#xff0c;也就是先头后左再右&#xff1a;1245367 public static void prePrint(BinaryTreeNode root) {if (root ! n…

BIM轻量化引擎的国内外发展现状

随着BIM技术的不断发展&#xff0c;对BIM技术应用要求已不局限于模型及基于模型的应用&#xff0c;其在经历了方案展示、BIM建模及应用两个阶段后&#xff0c;逐步向基于BIM平台的信息化管理模式升级&#xff0c;“模型是基础&#xff0c;管理是核心”的理念成为BIM应用的主流方…

一些FreeRTOS系统的usb命令使用方法

在全志R128开发过程中总结一些RTOS系统的usb命令使用方法&#xff0c;以下命令在所有RTOS平台&#xff08;MELIS/FREERTOS&#xff09;都可以使用 通过menuconfig打开usb模块功能 RTOS通过usb命令集成了测试用例。通过如下命令即可显示支持的功能&#xff1a; //输入如下命令…

rsyslog实现将日志存储到mysql中

​ 前提&#xff1a;准备好msql server或mariadb server&#xff1b; ​ 1、安装rsyslog连接至mysql server的驱动模块&#xff1b; [13:24 rootcentos6.8~]# yum install -y rsyslog-mysql [13:24 rootcentos6.8~]# rpm -ql rsyslog-mysql /lib64/rsyslog/ommysql.so /usr/…