二十三种设计模式:单例模式

news/2025/3/21 9:44:48/

单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式可以避免多个实例造成的资源浪费和冲突问题,同时也方便了对实例的管理和控制。

在C++中,可以通过以下方式实现单例模式:

  1. 静态成员变量:将类的实例作为静态成员变量,通过静态成员函数获取实例。静态成员变量只会被初始化一次,保证了只有一个实例。

  2. 懒汉式:在第一次使用时创建实例,通过静态成员函数获取实例。需要注意线程安全问题,可以通过加锁等方式解决。

  3. 饿汉式:在程序启动时创建实例,通过静态成员函数获取实例。需要注意实例的初始化顺序问题,可以通过静态初始化解决。

  4. Meyers’ Singleton:利用静态局部变量的特性,在第一次使用时创建实例。该方式可以避免线程安全问题和实例初始化顺序问题,但需要注意静态局部变量的线程安全问题。

以上是常用的单例模式实现方式,需要根据具体情况选择合适的方式。同时,还需要注意单例模式的使用场景和限制,避免滥用和误用。

C++实现单例模式

以下是一个简单的单例模式的C++代码:

class Singleton {
private:static Singleton* instance;Singleton() {} // 构造函数私有化,防止外部实例化public:static Singleton* getInstance() {if (instance == nullptr) {instance = new Singleton();}return instance;}void doSomething() {// 单例类的具体操作}
};Singleton* Singleton::instance = nullptr;

在这个代码中,我们定义了一个名为Singleton的类,其中包含一个私有的静态指针instance,用于存储单例对象的唯一实例。构造函数被私有化,这意味着外部无法直接实例化Singleton类的对象。我们通过getInstance()方法来获取Singleton类的唯一实例,如果instance指针为空,则创建一个新的Singleton对象并将其赋值给instance指针。最后,我们定义了一个doSomething()方法,用于执行单例类的具体操作。

需要注意的是,这个代码只是一个简单的示例,实际上单例模式的实现可能会更加复杂,需要根据具体的需求进行调整。

Rust 实现单例模式

以下是一个注释丰富的Rust单例模式代码:

use std::sync::{Mutex, Once};// 使用lazy_static宏来实现单例模式
lazy_static! {// 定义一个名为SINGLETON的Mutex<Singleton>对象,用于存储单例对象的唯一实例static ref SINGLETON: Mutex<Singleton> = Mutex::new(Singleton::new());
}// 定义一个名为Singleton的结构体,用于存储单例类的具体属性和操作
struct Singleton {// 单例类的具体属性
}impl Singleton {// 定义一个名为new的函数,用于创建Singleton类的唯一实例fn new() -> Self {// 单例类的具体初始化操作Self {// 初始化属性}}// 定义一个名为do_something的函数,用于执行单例类的具体操作fn do_something(&self) {// 单例类的具体操作}
}// 定义一个名为get_singleton的函数,用于获取Singleton类的唯一实例
pub fn get_singleton() -> &'static Mutex<Singleton> {// 返回一个静态的Mutex<Singleton>引用,这样我们就可以在程序的任何地方获取Singleton类的唯一实例&SINGLETON
}

在这个代码中,我们使用注释来解释每个部分的作用和功能。我们使用lazy_static宏来实现单例模式,定义了一个名为SINGLETON的Mutex对象,用于存储单例对象的唯一实例。我们定义了一个名为Singleton的结构体,用于存储单例类的具体属性和操作。在get_singleton()函数中,我们返回了一个静态的Mutex引用,这样我们就可以在程序的任何地方获取Singleton类的唯一实例。

需要注意的是,Rust的单例模式实现与C++的实现略有不同,这是因为Rust的所有权和生命周期机制与C++不同。但是,这个代码仍然可以实现单例模式的基本功能。


http://www.ppmy.cn/news/162236.html

相关文章

如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?

本文将详细介绍如何使用SpringBoot和Netty实现一个WebSocket服务器&#xff0c;并配合Vue前端实现聊天功能。 WebSocket是一种基于TCP的协议&#xff0c;它允许客户端和服务器之间进行双向通信&#xff0c;而不需要像HTTP那样进行请求和响应。Netty是一个Java网络编程框架&…

基于java SpringBoot和Vue uniapp的校园信息交流小程序

随着信息社会的网络化和计算机科学的广泛普及和迅速普及应用&#xff0c;具有综合智能的我国校园信息教育网络已成为推动中小学科学教育及其实践科学发展的信息技术手段。迅速推进了信息化改革&#xff0c;改善了高校信息交流的网络环境&#xff0c;提高了信息教育平台的管理水…

解决WPS公式上浮问题

公式上浮问题如下所示&#xff1a; 全选后鼠标右键点击&#xff0c;选择“段落” 选择“换行和分页”&#xff0c;最下面文本对齐方式选择“居中对齐”&#xff0c;点击确定。 公式位置就能恢复正常了。

量产24V 开关电源 明纬350W/24V电源方案 明纬电源电路图

量产24V 开关电源 明纬350W/24V电源方案 明纬电源电路图 明纬350W/24V电源方案全套资料 资料包含原理图&#xff0c;PCB&#xff0c;BOM,电感变压器自作资料 ID:7539614019496288更多新品关注TB晴咔电子

婴儿洗澡时,防止浴霸伤眼

我们用一个故事来开始这篇文章。媒体报道陕西的一个小男孩出生后一个多月&#xff0c;父母经常为宝宝洗澡十几分钟。在洗澡的时候&#xff0c;孩子经常的盯着浴霸看。经过一段时间以后&#xff0c;孩子出现了经常揉眼睛的现象。到了后来&#xff0c;父母的手掌在孩子的眼前晃动…

北邮数电-模拟浴霸控制器经验分享

作者是北邮信通院一名学生&#xff0c;在刚过去的大二上学期中学习了数电&#xff0c;并做了许多数电实验&#xff0c;在学习过程中&#xff0c;发现网上能参考的资源很有限&#xff0c;遇到不会的地方只能询问身边的同学或自己摸索&#xff0c;很是困难&#xff0c;所以我将刚…

Java 接入腾讯云 SMS 发短信(2023/06/02)

Java 接入腾讯云 SMS 文章目录 Java 接入腾讯云 SMS1. 开通短信服务1.1 注册腾讯云账号1.2 开通短信服务 2. 配置短信内容2.1 创建签名2.2 创建正文模板 3. 发送短信 本文将介绍如何通过 Java 接入腾讯云 SMS 实现发短信功能。 1. 开通短信服务 1.1 注册腾讯云账号 注册 - 腾…

JavaWeb18(文件上传富文本编辑器)

目录 一、富文本编辑器 1.1 什么是富文本编辑器? 1.2 CKEditor 1.3 CKEditor 4的使用步骤【参考官方文档】 1.4 优化商品增加、查看、修改功能 1.5 尝试课外扩展其他富文本编辑器 二、文件上传 2.1 到底客户端的文件是上传到哪里? 2.2 SmartUpload是什么? 2.3 Sma…