设计模式:单例模式

server/2024/10/19 4:16:08/

单例模式保证一个类只有一个实例,并且提供了全局访问该实例的方法。在单例模式中,通常使用一个静态方法或者一个静态变量来保存实例。该实例被程序的所有模块共享。

具体过程:

1、定义一个单例类

2、私有化构造函数,防止外界直接创界单例类的对象

3、禁用拷贝构造,移动赋值等函数,可以私有化,也可以直接使用=delete

4、使用一个公有的静态方法获取该实例

5、确保在第一次调用之前该实例被构造

在写具体代码之前还需要知道单例模式的两种分类,饿汉和懒汉。所谓的饿和懒其实是创建实例的状态形容。

饿汉就是一点不顾一切的感觉,在类加载的时候就创建唯一的单例实例,不论该实例是否会被使用。这种方式是线程安全的。

#pragma once
#include  <mutex>
//饿汉模式
class Singleton {
private://私有构造函数Singleton() {}//私有静态指针,指向唯一的实例static Singleton* instance;
public://禁用拷贝构造和赋值构造函数。Singleton(const Singleton&) = delete;Singleton& operator = (const Singleton&) = delete;//获取唯一实例的静态方法static Singleton* getInstance(){return instance;}
};
Singleton* Singleton::instance = nullptr;   //初始化静态成员
Singleton* Singleton::instance = new Singleton();

而懒汉则是有一种能少创建就少创建的偷懒的感觉,即只要在第一次调用获取实例的方法时才会创建唯一实例,从而节省资源。这种方式是线程不安全的,需要去加锁。

//加锁的懒汉模式
class SingletonH
{
private:singletonH() {};static SingletonH* instance;static std::mutex mutex;
public:Singleton(const Singleton&) = delete;Singleton& operator = (const Singleton&) = delete;static Singleton* getInstance(){if(instance == nullptr){std::lock_guard<std::mutex>lock(mutex);  //加锁instance = new SingletonH();}return instance;}
};
SingletonH* SingletonH::instance = nullptr;

总结:饿汉单例适合在程序启动时资源充足,且需要立即使用单例的场景。懒汉单例适合资源敏感的场景,或者单例实例较大且不一定每次都需要实例化时使用。


http://www.ppmy.cn/server/132938.html

相关文章

如何在Android中存储数据?

在Android中存储数据是开发过程中至关重要的一环&#xff0c;根据数据的类型、大小、访问频率及安全性需求&#xff0c;开发者可以选择多种存储方式。以下是Android中存储数据的几种主要方式&#xff0c;每种方式都有其特定的应用场景和优缺点。 一、SharedPreferences Share…

Redis拒绝连接问题分析与解决方案

目录 前言1. 问题描述2. Redis拒绝连接的常见原因分析2.1 Redis服务未启动2.2 Redis配置中的绑定地址问题2.3 防火墙或安全组问题2.4 Redis连接池耗尽2.5 Redis服务器负载过高2.6 权限配置问题 3. 深度解决方案和优化建议4. 总结 前言 在分布式系统中&#xff0c;Redis作为高性…

Java基于SSM微信小程序物流仓库管理系统设计与实现(lw+数据库+讲解等)

选题背景 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

机器学习:opencv--光流估计

目录 前言 一、光流估计前提 1.亮度恒定 2.小运动 3.空间一致 二、光流估计案例 前言 光流估计&#xff08;Optical Flow Estimation&#xff09;是计算机视觉中的一种技术&#xff0c;用于估计在连续帧图像中物体或场景的运动。它基于假设&#xff1a;在短时间间隔内&am…

Spring Boot为医疗行业B2B平台带来的变革

第2章 设计技术与开发环境 2.1 相关技术介绍 2.1.1 B/S模式分析 C/S模式主要由客户应用程序(Client)、服务器管理程序(Server)和中间件(middleware)三个部件组成。客户应用程序是系统中用户与数据组件交互。服务器程序负责系统资源&#xff0c;如管理信息数据库的有效管理&…

【Python数据分析】利用Pandas库轻松处理大数据

【Python数据分析】利用Pandas库轻松处理大数据 在现代数据分析中&#xff0c;随着数据量的快速增长&#xff0c;处理大规模数据成为了必然的挑战。幸运的是&#xff0c;Python作为最受欢迎的编程语言之一&#xff0c;其生态系统为我们提供了强大的工具&#xff0c;尤其是Pand…

Cocos Creator 原生Android项目打 aab 包,升级到Android14(API 34)

注意:打aab包的前提是需要配置对应gradle文件。这里我简单说下,我这边做的。 1.setting.gradle文件中配置 include ‘:asset_pack’ 。如下图 2.找到对应的 asset_pack 的 gradle文件,一定要改assetPack。如下图: deliveryType = “install-time” //PAD资源分发 安装时分…

Switching Temporary Teachers for Semi-Supervised Semantic Segmentation 论文阅读

code: naver-ai/dual-teacher: Official code for the NeurIPS 2023 paper "Switching Temporary Teachers for Semi-Supervised Semantic Segmentation" (github.com) paper: 7eeb42802d3750ca59e8a0523068e9e6-Paper-Conference.pdf (neurips.cc) 在半监督语义分…