单例模式入门

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。

普通构造函数无法实现上述行为, 因为构造函数的设计决定了它必须总是返回一个新对象。

还记得那些存储重要对象的全局变量吗? 它们在使用上十分方便, 但同时也非常不安全, 因为任何代码都有可能覆盖掉那些变量的内容, 从而引发程序崩溃。

和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。

还有一点: 你不会希望解决同一个问题的代码分散在程序各处的。 因此更好的方式是将其放在同一个类中, 特别是当其他代码已经依赖这个类时更应该如此。

在这里插入图片描述

在C++中,实现单例模式通常涉及以下几个步骤:

私有化构造函数:防止外部通过new关键字直接创建类的实例。
私有化拷贝构造函数和赋值运算符:防止通过拷贝或赋值创建新的实例。
创建一个静态的类成员变量:用于存储类的唯一实例。
提供一个静态的公有成员函数:用于获取类的唯一实例(通常称为getInstance)。
下面是一个简单的C++单例模式实现例子:

cpp
#include
#include // for std::unique_ptr

class Singleton {
public:
// 禁用拷贝构造函数和赋值运算符
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

// 提供一个静态的公有成员函数来获取唯一实例
static Singleton& getInstance() {// 局部静态变量具有线程安全性(C++11及以后)static Singleton instance;return instance;
}// 其他成员函数
void doSomething() {std::cout << "Doing something in Singleton!" << std::endl;
}

private:
// 私有化构造函数
Singleton() {
std::cout << “Singleton instance created!” << std::endl;
}

// 禁止析构函数被外部调用(虽然在这个例子中不是必须的,但可以作为一种防御性编程策略)
~Singleton() = default;

};

int main() {
// 获取单例实例并调用其成员函数
Singleton& singleton = Singleton::getInstance();
singleton.doSomething();

// 尝试获取另一个实例(实际上是同一个实例)
Singleton& anotherSingleton = Singleton::getInstance();
anotherSingleton.doSomething();// 注意:在main函数结束时,局部静态变量(即单例实例)会自动销毁
return 0;

}
在这个例子中,Singleton类有一个私有的构造函数,这意味着你不能从类外部直接创建Singleton的实例。相反,你必须通过getInstance静态成员函数来获取类的唯一实例。这个函数检查是否已经创建了实例,如果没有,则创建一个新的实例并返回它;如果已经创建了实例,则直接返回该实例。

注意,在C++11及以后的版本中,局部静态变量的初始化是线程安全的,这意味着在多线程环境中调用getInstance函数时,不需要额外的同步机制来保证只有一个实例被创建。

此外,拷贝构造函数和赋值运算符被删除,以防止通过拷贝或赋值来创建新的Singleton实例。虽然在这个简单的例子中可能看起来不是必须的,但在更复杂的场景中,这是一种重要的防御性编程策略。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

圆域函数的傅里叶变换和傅里叶逆变换

空域圆域函数的傅里叶变换 空域圆域函数&#xff08;也称为空间中的圆形区域函数&#xff09;通常指的是在二维空间中&#xff0c;以原点为中心、半径为 a a a的圆内取值为1&#xff0c;圆外取值为0的函数。这种函数可以表示为&#xff1a; f ( x , y ) { 1 if x 2 y 2 ≤ …

element-plus弹窗二次封装踩坑

1 基于element-plus的二次封装弹窗很常见。代码如下&#xff1a; 父组件&#xff1a; import Dialog from ./components/Dialogs/testDailog.vueconst showref(false) const openDialog()>{show.valuetrue}<button click"openDialog" >打开dialoag</bu…

HTML和CSS 表单、表格练习

HTML和CSS 表格练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML表格练习</title>…

【大模型】深度解析 NLP 模型5大评估指标及 应用案例:从 BLEU、ROUGE、PPL 到METEOR、BERTScore

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;无论是机器翻译、文本生成&#xff0c;还是问答系统开发&#xff0c;模型性能评估指标始终是开发者绕不开的工具。BLEU、ROUGE、PPL&#xff08;困惑度&#xff09;、METEOR 和 BERTScore 是五个最具代表性的指标&am…

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一…

Java高级特性 - IO流

第1关 什么是IO流 BC,C 第2关 字节流-输入输出 第3关 字符流 - 输入输出 第4关 复制文件

BERT 详解

BERT简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由 Google 在 2018 年提出的一种预训练语言模型。BERT 在自然语言处理&#xff08;NLP&#xff09;领域取得了重大突破&#xff0c;因为它能够有效地捕捉文本的上下文信息&am…

LLM大模型意图识别:分类算法lora训练案例

参考&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/141134380 &#xff08;LLaMA-Factory 微调训练&#xff09; https://modelscope.cn/competition/54/summary?seasonId56 https://github.com/coggle-club/notebooks/blob/main/notebooks/llm/RAG-BM…

SCI文献推荐-基于物联网的新型压降控制,用于多个微电网之间的电池 SoC 平衡

Novel IoT-Based Droop Control for Battery SoC Balancing Among Multiple Microgrids 基于物联网的新型压降控制&#xff0c;用于多个微电网之间的电池 SoC 平衡 |IEEE期刊和杂志 |IEEE Xplore 摘要&#xff1a;储能系统是微电网的重要组成部分&#xff0c;弥补了其自主运行…

(计算机网络)期末

计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据&#xff08;串行输入&#xff09; 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前&#xff0c;要对信源进行一个编码&#xff0c;收到信息之后要进行一个…

Rk3588 onnx转rknn,出现 No module named ‘rknn‘

一、操作步骤&#xff1a; rk3588 需要将yolo11 的模型onnx转rknn。 https://github.com/airockchip/rknn_model_zoo/tree/main/examples/yolo11 这个是用yolo11训练的模型&#xff0c;有80种类型。 完整下载下来后&#xff0c;在按文档描述下载模型下来&#xff1a; 然后进…

鸿蒙开发异步与线程

鸿蒙对于异步提供了三种处理方式&#xff08;注意这里是异步&#xff0c;不是特指线程&#xff09;&#xff1a; 1.JS原生的Promise异步 2.taskPool线程 3.worker常驻线程 Promise异步 对于我们做 Android开发&#xff0c;经常提到异步&#xff0c;就习惯性的认为是起个子线…

DDR3与MIG IP核详解(一)

一、ddr3(全称第三代双倍速率同步动态随机存储器)&#xff1a; 1、特点&#xff1a;1&#xff1a;掉电无法保存数据&#xff0c;需要周期性的刷新。2:时钟上升沿和下降沿都会传输数据。 3&#xff1a;突发传输&#xff0c;突发长度 Burst Length一般为…

多模态和大模型原理

一、图文匹配原理 Clip 通过图像编码器和照片编码器将两者区分成N项&#xff0c;然后让它们相互内积&#xff0c;能够匹配得上的则内积值为1&#xff0c;不能够匹配上的则内积为-1&#xff0c;也就是负样本&#xff0c;如上图&#xff0c;除了对角线的正样本&#xff0c;周围…

15 go语言(golang) - 并发编程goroutine原理及数据安全

底层原理 Go 的 goroutine 是一种轻量级的线程实现&#xff0c;允许我们在程序中并发地执行函数。与传统的操作系统线程相比&#xff0c;goroutine 更加高效和易于使用。 轻量级调度 用户态调度&#xff1a;Go 运行时提供了自己的调度器&#xff0c;这意味着 goroutine 的创建…

Flink细粒度的资源管理

Apache Flink致力于为所有应用程序自动导出合理的默认资源需求。对于希望根据其特定场景微调其资源消耗的用户,Flink提供了细粒度的资源管理。这里我们就来看下细粒度的资源管理如何使用。(注意该功能目前仅对DataStream API有用) 1. 适用场景 使用细粒度的资源管理的可能…

《操作系统 - 清华大学》5 -5:缺页异常

文章目录 1. 缺页异常的处理流程2.在何处保存未被映射的页&#xff1f;3. 虚拟内存性能 1. 缺页异常的处理流程 缺页中断的处理过程: CPU读内存单元&#xff0c;在TLB中根据其虚拟地址匹配物理地址&#xff0c;未命中&#xff0c;读页表; 由于页表项的存在位为0&#xff0c;CP…

​智能马桶蓝牙芯片方案

RAMSUN提供的智能马桶蓝牙芯片方案通过蓝牙低功耗&#xff08;BLE&#xff09;技术&#xff0c;智能马桶能够实现远程固件升级&#xff0c;即OTA&#xff08;Over-The-Air&#xff09;功能。用户无需亲自操作复杂的升级步骤&#xff0c;只需通过智能设备即可完成固件的更新&…

Linux-NFS

文章目录 NASNFSNFS配置 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月27日12点50分 NAS 网络接入存储 共享存储文件存储 NAS设备包括 NAS引擎一个或多个网络接口一个操作系统…

【智能制造-44】装配仿真

装配仿真包含以下功能模块&#xff1a; 零件建模与导入模块 功能描述&#xff1a; 能够创建简单的几何零件&#xff0c;如立方体、圆柱体、球体等基本形状。这对于一些标准件或者形状规则的零件来说&#xff0c;可以直接在装配仿真软件中生成&#xff0c;方便快捷。 支持多种…