当前位置: 首页 > 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盘内存啦&#…...

Claude代码会话实战指南:从问答到结构化协作的效能提升

1. 项目概述&#xff1a;Claude Code Session 的实战效能提升指南最近在深度使用 Claude 进行代码开发时&#xff0c;我发现了一个宝藏仓库&#xff1a;mantra-hq/claude-code-session-tips。这并非一个可以直接运行的软件库&#xff0c;而是一份由社区高手们精心整理的、关于如…...

Windows XP图标主题:5分钟让你的现代Linux桌面重获经典魅力

Windows XP图标主题&#xff1a;5分钟让你的现代Linux桌面重获经典魅力 【免费下载链接】Windows-XP Remake of classic YlmfOS theme with some mods for icons to scale right 项目地址: https://gitcode.com/gh_mirrors/win/Windows-XP 还在怀念那个经典的开始按钮和…...

10个必备的Solidity安全技巧:Secureum-mind_map实践经验分享

10个必备的Solidity安全技巧&#xff1a;Secureum-mind_map实践经验分享 【免费下载链接】secureum-mind_map Central Repository for the Epoch 0 coursework and quizzes. Contains all the content, cross-referenced and linked. 项目地址: https://gitcode.com/gh_mirr…...

零代码部署 OpenClaw:Win11 一键安装与使用教程

OpenClaw&#xff08;小龙虾&#xff09;Windows 11 一键部署教程 2026 最新版 零代码免配置解压即用适用系统&#xff1a;Windows 11 专业版 / 家庭版 / 正式版&#xff08;全版本兼容&#xff09; 项目介绍&#xff1a;OpenClaw 是 GitHub 星标 28W 的开源本地 AI 智能体&am…...

如何用嘎嘎降AI处理期刊投稿论文:SCI核心期刊论文全流程降AI4.8元完整操作教程

如何用嘎嘎降AI处理期刊投稿论文&#xff1a;SCI核心期刊论文全流程降AI4.8元完整操作教程 第一次用降AI工具会遇到很多不确定的地方——传什么格式、选哪个模式、怎么验收效果。 这篇教程把常见问题都覆盖了&#xff0c;主要基于嘎嘎降AI&#xff08;www.aigcleaner.com&…...

认知神经科学研究报告【20260062】

ForeSight 5.88.2 算术推理能力报告 主题&#xff1a;从个位数原子规则到多位数加减法的&#xff2c;&#xff14;&#xff0b;自主涌现一、系统拥有的先验知识 系统仅被赋予 390 条个位数四则运算的原子事实&#xff08;如 358、7963、1-7-6&#xff09;&#xff0c;这些是最底…...

DuckyClaw工具链解析:智能家居硬件安全与固件提取实战

1. 项目概述&#xff1a;从“DuckyClaw”看智能家居的硬件安全研究最近在翻看一些开源硬件项目时&#xff0c;一个名为“DuckyClaw”的仓库引起了我的注意。这个项目托管在涂鸦智能&#xff08;Tuya&#xff09;的官方GitHub组织下&#xff0c;名字本身就很有意思——“鸭子爪”…...

全球轻型巡飞弹药行业发展现状、机遇与前景分析

一、行业概述与全球市场规模轻型巡飞弹药是融合无人机技术与精确弹药技术的新型无人航空武器系统&#xff0c;具备轻量化、可携行、高精度、自主滞空作战的核心特性。该装备可通过单兵、车载、舰载等多平台发射&#xff0c;能在目标区域自主巡飞、识别跟踪目标&#xff0c;可灵…...

工业AI系统安全防护与零信任架构

当工厂的"大门"不再只是一道铁门,安全该如何升级? 引言:从"大铁门"到"智能门禁" 想象一座传统工厂:四周围墙高耸,大门紧闭,保安大爷坐在门房里,凭工作证放行。这就是传统网络安全的写照——"围墙式"防御,相信"里面的人&…...

告别RAM焦虑:手把手教你用MicroBlaze BootLoader把大程序塞进QSPI Flash和DDR3

突破FPGA内存瓶颈&#xff1a;MicroBlaze大型程序加载实战指南 当你的MicroBlaze项目从简单的控制逻辑升级到需要文件系统、网络协议栈甚至实时操作系统时&#xff0c;代码体积的膨胀速度往往超出预期。那些曾经足够用的BRAM资源突然变得捉襟见肘——这就像试图在智能手机上运行…...