当前位置: 首页 > news >正文

23种设计模式之单例模式

目录

什么是单例模式

单例模式的优点 

创建单例模式的三大要点 

单例模式的实现方式

饿汉模式 

懒汉模式

使用场景


什么是单例模式

单例模式是一种创建型设计模式,它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。

什么是只有一个实例?

就是在整个应用程序中,只存在该类的一个实例对象,而不是创建多个相同类型的对象。

单例模式的优点 

  1. 全局控制:保证只有一个实例,这样就可以严格的控制用户怎样访问它何时访问它;
  2. 节省资源:只有一个实例存在,避免多次创建相同的对象,从而节省了系统资源;
  3. 提高性能:单例模式可以实现懒加载,只有在需要的时候才进行实例化。

创建单例模式的三大要点 

  1. 私有的构造函数:防止外部代码直接创建类的实例
  2. 私有的静态变量:保证该类的唯一实例
  3. 公有的静态方法:通过这个公有的静态方法来获取实例(全局访问点)

单例模式的实现方式

饿汉式:在类加载时就已经完成了实例的创建,不管后面创建的实例有没有使用,先创建再说。

懒汉式: 只有在请求实例时才会创建,如果首次请求时还没创建,就创建一个新的实例,如果已经创建了就返回已有的实例。

优缺点比较:

  • 饿汉模式在刚开始就创建了实例,不存在线程安全问题,但是有可能创建的实例一直没用,会造成资源浪费;
  • 懒汉模式只有在请求的时候才会创建不存在资源浪费,但是如果有多个线程同时访问getInstance()并且同一时刻检测到没有创建实例,就可能会同时创建实例,违背了单例模式,可以用互斥锁来解决。

饿汉模式 

//饿汉模式:在类加载的时候就创建实例,可能会没有使用而造成资源浪费
public class Singleton_e {
//    私有的静态实例变量private static final Singleton_e instance=new Singleton_e();private Singleton_e(){
//        私有的构造方法}
//    公有的静态访问方法public static Singleton_e getInstance(){return instance;}
}

懒汉模式

public class Singleton_l {
//     懒汉模式:在请求实例的时候才会创建
//    私有的静态变量private static Singleton_l instance;
//    私有的构造方法private Singleton_l(){}
//    公有的静态方法
//    使用双重校验锁来确保线程安全public static Singleton_l getInstance(){if(instance==null){synchronized (Singleton_l.class){if(instance==null){return new Singleton_l();}}}return instance;}
}

使用场景

1. 资源共享
多个模块共享某个资源的时候,可以使⽤单例模式,⽐如说应⽤程序需要⼀个全局的配置管理器来存储和管理配置信息。
2. 只有⼀个实例
当系统中某个类只需要⼀个实例来协调⾏为的时候,可以考虑使⽤单例模式, ⽐如说管理应⽤程序中的缓存,确保只有⼀个缓存实例,避免重复的缓存创建和管理。
3. 懒加载
如果对象创建本身就⽐较消耗资源,⽽且可能在整个程序中都不⼀定会使⽤,可以使⽤单例模式实现懒加载。

相关文章:

23种设计模式之单例模式

目录 什么是单例模式 单例模式的优点 创建单例模式的三大要点 单例模式的实现方式 饿汉模式 懒汉模式 使用场景 什么是单例模式 单例模式是一种创建型设计模式,它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。 什…...

leetCode 30天

题太难了&#xff0c;就来一个N皇后吧 51. N 皇后 class Solution { private:vector<vector<string>> res;void backtracking(int n, int row, vector<string>& chessboard){if (row n){res.push_back(chessboard);return;}for (int col 0; col<n;…...

vue3+vite+ts 配置commit强制码提交规范配置 commitlint

配置 git 提交时的 commit 信息&#xff0c;统一提交 git 提交规范 安装命令: npm install -g commitizen npm i cz-customizable npm i commitlint/config-conventional commitlint/cli -D 文件配置 根路径创建文件 commitlint.config.js module.exports {// 继承的规…...

PlateUML绘制UML图教程

UML&#xff08;Unified Modeling Language&#xff09;是一种通用的建模语言&#xff0c;广泛用于软件开发中对系统进行可视化建模。PlantUML是一款强大的工具&#xff0c;通过简单的文本描述&#xff0c;能够生成UML图&#xff0c;包括类图、时序图、用例图等。PlantUML是一款…...

自然语言处理(NLP)——使用Rasa创建聊天机器人

1 基本概念 1.1 自然语言处理的分类 IR-BOT&#xff1a;检索型问答系统 Task-bot&#xff1a;任务型对话系统 Chitchat-bot:闲聊系统 1.2 任务型对话Task-Bot:task-oriented bot 这张图展示了一个语音对话系统&#xff08;或聊天机器人&#xff09;的基本组成部分和它们之间的…...

使用虚拟主机部署多站点

网站目录权限的管理和虚拟主机的配置。 目录权限控制...

Openresty+Lua+Redis实现高性能缓存

一、背景 当我们的程序需要提供较高的并发访问时&#xff0c;往往需要在程序中引入缓存技术&#xff0c;通常都是使用Redis作为缓存&#xff0c;但是要再更进一步提升性能的话&#xff0c;就需要尽可能的减少请求的链路长度&#xff0c;比如可以将访问Redis缓存从Tomcat服务器…...

基于Vue2用keydown、keyup事件实现长按键盘任意键(或组合键)3秒触发自定义事件(以F1键为例)

核心代码 <template></template> <script> export default {created() {//监听长按快捷键addEventListener("keydown", this.keydown);addEventListener("keyup", this.keyup);},destroyed(d) {//移除长按快捷键removeEventListener(&…...

【C#】.net core 6.0 设置根目录下某个文件夹可访问,访问创建的图片等资源

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…...

报错ValueError: Unknown CUDA arch (8.6) or GPU not supported

文章目录 问题描述解决方案参考文献 问题描述 报错 ValueError: Unknown CUDA arch (8.6) or GPU not supported 本人显卡为 RTX 3060&#xff0c;CUDA 为 10.2&#xff0c;PyTorch 为 1.5 解决方案 修改 C:\Users\Administrator\Envs\test\Lib\site-packages\torch\utils\c…...

Golang 并发 Cond条件变量

Golang 并发 Cond条件变量 背景 编写代码过程中&#xff0c; 通常有主协程和多个子协程进行协作的过程&#xff0c;比如通过 WaitGroup 可以实现当所有子协程完成之后&#xff0c; 主协程再继续执行。 如上的场景是主协程等待子协程达到某个状态再继续运行。 但是反过来怎么…...

linux 下 chrome 无法在设置里面配置代理的解决方法

文章目录 [toc]解决方法查找 chrome 命令路径查看 chrome 启动文件方式一方法二 在 linux 环境下&#xff0c;使用 chrome 没办法像 firefox 一样在设置里面配置代理&#xff0c;打开 chrome 的设置会有下面的内容显示 When running Google Chrome under a supported desktop e…...

C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析

1、MC协议帧 MC协议可以在串口通信&#xff0c;也可以在以太网通信&#xff0c;有A-1E和Qna-3E两种模式&#xff0c;这两种都是三菱PLC通信协议中比较常用的两种&#xff0c;一般我们使用比较多的是以太网通信&#xff0c;对于FX5U系列/Q系列/Qna系列/L系列的PLC&#xff0c;…...

nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法

1、我们知道 nodeJS 是老外搞出来的&#xff0c;服务器放在了国外&#xff0c;国内的小朋友访问起来会比较慢&#xff0c;阿里巴巴的淘宝给出了有力支持&#xff0c;现在我们就将 nodeJS 的镜像地址切换为国内的淘宝镜像。 2、查看当前的镜像地址&#xff1a; npm get registr…...

Nginx方向代理和负载均衡配置

1. Nginx介绍 2.Nginx常用命令 cd /usr/local/nginx/sbin/ ./nginx 启动 ./nginx -s stop 停止 ./nginx -s quit 安全退出 ./nginx -s reload 重新加载配置文件 如果我们修改了配置文件&#xff0c;就需要重新加载。 ps aux|grep nginx 查看nginx进程3.nginx配置文件 …...

贪心算法篇

“靠漫步&#xff0c;将生趣填饱~” 贪心算法简介&#xff1f; 贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff0c;也称为贪婪算法&#xff0c;是一种在解决问题时采取贪心策略的方法。其基本原理是很简单的&#xff1a; “在每个决策点上都选择当下看似最好的选项…...

springboot/ssm大学生就业服务平台就业招聘宣传管理系统Java系统

springboot(ssm大学生就业服务平台 就业招聘宣传管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql…...

上下固定中间自适应布局

实现上下固定中间自适应布局 1.通过position&#xff1a;absolute实现 定义如下结构 <body> <div class"container"> <div class"top"></div> <div class"center"></div> <div class"bottom&…...

3分钟部署完成Docker Registry及可视化管理工具Docker-UI

安装docker-registry 由于镜像文件会非常占用空间&#xff0c;因此需要选择一个磁盘充裕的位置来存放镜像数据。 这里设置为&#xff1a;-v /data/registry:/var/lib/registry&#xff0c;其中/data/registry是宿主机存放数据的位置。 docker run -d -p 5000:5000 --restart…...

【npm】修改npm全局安装包的位置路径

问题 全局安装的默认安装路径为&#xff1a;C:\Users\admin\AppData\Roaming\npm&#xff0c;缓存路径为&#xff1a;C:\Users\admin\AppData\Roaming\npm_cache&#xff08;其中admin为自己的用户名&#xff09;。 由于默认的安装路径在C盘&#xff0c;太浪费C盘内存啦&#…...

NaViL-9B部署案例:中小企业用双24GB显卡替代A100实现降本增效

NaViL-9B部署案例&#xff1a;中小企业用双24GB显卡替代A100实现降本增效 1. 项目背景与价值 在AI大模型应用日益普及的今天&#xff0c;中小企业面临着高昂的硬件投入成本。传统部署方案通常需要A100等高端显卡&#xff0c;单卡价格动辄数万元&#xff0c;让许多企业望而却步…...

Matlab 实现 DES 与 RSA 双重加密及可视化界面搭建

基于matlab上的DES和RSA两种算法的双重加密&#xff0c;附带显示界面&#xff0c;可更改DES密钥&#xff0c;明文消息&#xff08;在显示界面中&#xff09;&#xff0c;可在代码中更改RSA对应的p&#xff0c;q&#xff0c;e等数据&#xff0c;代码可附加注释和对应要求修改。在…...

PyTorch 2.8镜像多场景落地:智慧农业病虫害识别模型田间部署方案

PyTorch 2.8镜像多场景落地&#xff1a;智慧农业病虫害识别模型田间部署方案 1. 田间AI的迫切需求 现代农业正面临病虫害防治的严峻挑战。传统人工巡查方式效率低下&#xff0c;一个熟练的技术员每天最多能检查3-5亩作物&#xff0c;而大型农场往往需要数十人同时作业。更棘手…...

SecGPT-14B实战手册:Chainlit中集成Markdown渲染与代码块语法高亮

SecGPT-14B实战手册&#xff1a;Chainlit中集成Markdown渲染与代码块语法高亮 1. SecGPT-14B简介 SecGPT是由云起无垠推出的开源大语言模型&#xff0c;专门针对网络安全领域优化。该模型基于先进的自然语言处理技术&#xff0c;能够理解和生成与网络安全相关的专业内容。 S…...

DeOldify开源贡献指南:如何参与项目改进与代码提交

DeOldify开源贡献指南&#xff1a;如何参与项目改进与代码提交 想为DeOldify这个酷炫的图片上色项目添砖加瓦&#xff0c;但又觉得开源贡献这事儿门槛太高&#xff0c;不知道从何下手&#xff1f;别担心&#xff0c;你绝对不是一个人。很多人对开源既向往又畏惧&#xff0c;总…...

5步搞定OpenClaw+百川2-13B:WebUI v1.0镜像快速体验指南

5步搞定OpenClaw百川2-13B&#xff1a;WebUI v1.0镜像快速体验指南 1. 为什么选择这个组合&#xff1f; 上周我在测试本地AI自动化工具时&#xff0c;发现一个痛点&#xff1a;很多开源模型要么体积太大跑不动&#xff0c;要么功能太单一。直到在星图GPU平台看到百川2-13B-4b…...

静态图训练卡顿、NCCL超时、Graph Break频发?PyTorch 3.0分布式训练高频故障诊断与热修复清单,含12个可复用调试脚本

第一章&#xff1a;PyTorch 3.0静态图分布式训练故障全景认知PyTorch 3.0 引入的静态图编译&#xff08;TorchDynamo Inductor 后端&#xff09;与原生分布式训练&#xff08;如 FSDP、DDP&#xff09;深度耦合后&#xff0c;故障表现呈现多维交织特征&#xff1a;编译期图构建…...

FTDI FT2232H USB转JTAG实战指南:MPSSE配置与多设备调试

1. FT2232H与JTAG基础入门 第一次接触FT2232H这块芯片时&#xff0c;我完全被它的多功能性震惊了。这块小小的USB转接芯片不仅能处理UART通信&#xff0c;还能通过MPSSE引擎模拟JTAG、SPI、I2C等多种协议。对于嵌入式开发者来说&#xff0c;这简直就是调试神器。 FT2232H最吸引…...

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图,并存储数据库存储时间200ms左右

C#频谱图振动传感器温度传感器数据采集绘制频谱图和时域图&#xff0c;并存储数据库存储时间200ms左右&#xff0c;可以进行历史频谱图和时域图回放&#xff0c;可以求的最大值并设置阈值报警可以导出报警最近在搞工业设备监控系统的时候&#xff0c;需要实时采集振动和温度数据…...

Vue/React项目实战:集成docx-preview实现动态报表预览与下载功能

Vue/React项目实战&#xff1a;动态报表预览与下载的工程化实现 在数据驱动的企业应用中&#xff0c;动态生成和预览业务报表是刚需功能。想象这样一个场景&#xff1a;销售团队在CRM系统中筛选季度数据后&#xff0c;需要立即查看格式规范的业绩分析报告&#xff0c;并能一键…...