小谈设计模式(22)—单例模式
小谈设计模式(22)—单例模式
- 专栏介绍
- 专栏地址
- 专栏介绍
- 单例模式
- 点睛所在
- 优缺点分析
- 优点
- 确保只有一个实例
- 全局访问点
- 节省资源
- 线程安全
- 缺点
- 难以扩展
- 对象的生命周期
- 单一职责原则
- 隐藏依赖关系
- Java程序实例
- 实例a
- 分析
- 实例b,更安全
- 分析
- 优化 ——“双重检查锁定” 实现方式
- 分析
- 总结
专栏介绍
专栏地址
link
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。

单例模式
单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式在许多情况下都非常有用,比如控制资源的访问、线程池、日志对象等。

点睛所在
控制对象的实例化过程。通常情况下,我们可以通过将构造函数私有化来防止外部直接创建对象。然后,我们需要提供一个静态方法来获取单例对象,这个方法负责创建对象并在后续调用时返回同一个实例。
优缺点分析
优点
确保只有一个实例
单例模式可以确保一个类只有一个实例存在,这样可以避免多个实例之间的冲突和资源的浪费。
全局访问点
单例模式提供了一个全局访问点,使得其他对象可以方便地访问该实例,避免了对象之间的耦合。
节省资源
由于单例模式只创建一个实例,可以节省系统资源,特别是在需要频繁创建和销毁对象的情况下,可以显著提高系统的性能。
线程安全
通过合理的实现方式,单例模式可以保证在多线程环境下的线程安全性。

缺点
难以扩展
由于单例模式只允许存在一个实例,因此难以扩展为多个实例。如果需要创建多个实例,就需要修改单例模式的实现。
对象的生命周期
由于单例模式的实例在整个程序运行期间都存在,可能会导致对象的生命周期过长,造成资源的浪费。
单一职责原则
单例模式将创建对象和控制访问对象的责任集中在一起,违反了单一职责原则。这可能会导致单例类的职责过重,不利于代码的维护和扩展。
隐藏依赖关系
单例模式可能会导致对象之间的依赖关系变得隐式,使得代码的可读性和可维护性降低。

Java程序实例
实例a
public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
分析
在这个实现中,我们将构造函数私有化,然后提供了一个静态方法 getInstance() 来获取单例对象。在这个方法中,我们首先检查实例是否已经被创建,如果没有则创建一个新的实例并返回。这种实现方式被称为 “懒汉式”,因为它只有在第一次调用 getInstance() 方法时才会创建实例。
但是,这种实现方式并不是线程安全的。如果多个线程同时调用 getInstance() 方法,可能会导致多个实例被创建。为了解决这个问题,我们可以使用同步锁来保证线程安全。
实例b,更安全
public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
分析
在这个实现中,我们使用了 synchronized 关键字来保证线程安全。但是,这种实现方式会导致性能问题,因为每次调用 getInstance() 方法时都会进行同步。

优化 ——“双重检查锁定” 实现方式
public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
分析
在这个实现中,我们首先检查实例是否已经被创建,如果没有则进入同步块。在同步块中,我们再次检查实例是否已经被创建,如果没有则创建一个新的实例。使用 volatile 关键字可以保证多线程下的可见性。

总结
单例模式在一些特定的场景下非常有用,可以确保一个类只有一个实例,并提供全局访问点。但是,需要注意单例模式的实现方式,避免出现线程安全和性能问题,并权衡其优缺点来决定是否使用单例模式。
相关文章:
小谈设计模式(22)—单例模式
小谈设计模式(22)—单例模式 专栏介绍专栏地址专栏介绍 单例模式点睛所在优缺点分析优点确保只有一个实例全局访问点节省资源线程安全 缺点难以扩展对象的生命周期单一职责原则隐藏依赖关系 Java程序实例实例a分析实例b,更安全分析优化 ——“…...
华为OD机考算法题:分班
题目部分 题目分班难度易题目说明幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友是否同班,请你帮忙把同班的小朋友找出来。 小朋友的编号为整数,与前一位小朋友同班用 Y 表示,不同班用 N 表示…...
【gcc】RtpTransportControllerSend学习笔记 3:gcc
本文是大神 https://www.cnblogs.com/ishen 的文章的学习笔记。大神的webrtc源码分析(8)-拥塞控制(上)-码率预估 详尽而具体,堪称神作。本文使用的代码是m79 ,与大神有不同。2.4 Probe只会在一些特殊的时候才会进行探测(链路刚开始时, 码率不正常暴跌时)2.5 : 对发送的吞吐量…...
CSP-J第二轮试题-2019年-3题
文章目录 参考:总结 [CSP-J2019] 纪念品题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示答案 现场真题注意事项 参考: P5662 CSP-J2019纪念品 总结 本系列为CSP-J/S算法竞赛真题讲解,会按照年…...
数据库:Hive转Presto(三)
继续上节代码。 import re import os import tkinter.filedialog from tkinter import *class Hive2Presto:def __int__(self):self.t_funcs [substr, nvl, substring, unix_timestamp] \[to_date, concat, sum, avg, abs, year, month, ceiling, floor]self.time_funcs [d…...
【AI视野·今日Robot 机器人论文速览 第四十八期】Thu, 5 Oct 2023
AI视野今日CS.Robotics 机器人学论文速览 Thu, 5 Oct 2023 Totally 32 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers LanguageMPC: Large Language Models as Decision Makers for Autonomous Driving Authors Hao Sha, Yao Mu, Yuxuan Jiang, Li…...
学信息系统项目管理师第4版系列20_风险管理
1. 针对不确定性的应对方法 1.1. 【高23上选58】 1.2. 收集信息 1.2.1. 可以对信息收集和分析工作进行规划,以便发现更多信息(如进行研究、争取专家参与或进行市场分析)来减少不确定性 1.3. 为多种结果做好准备 1.3.1. 制定可用的解决方…...
卷积神经网络的发展历史-VGG
VGG的产生 2014 年,Simonyan和Zisserman提出了VGG系列模型(包括VGG-11/VGG-13/VGG-16/VGG-19),并在当年的ImageNet Challenge上作为分类任务第二名、定位(Localization)任务第一名的基础网络出现。 VGG的…...
qt解决信号和槽连接时传递额外参数的问题
解决信号和槽连接时传递额外参数的问题 QSignalMapper 是 Qt 框架中的一个类,用于解决信号和槽连接时传递额外参数的问题。当一个信号被触发时,QSignalMapper 可以将该信号与一个特定的参数关联起来,并将信号与对应的槽函数进行连接。 下面…...
『力扣每日一题14』:消失的数字
昨天忙过头,等想起来已经 12 点多了,于是乎断更了。在这里先跟广大读者说声抱歉,并且稍后我会再更一篇。 一、题目 数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&…...
【b站韩顺平 快速学Java课】Java的JDK8(包括公共JRE8)安装教程 总结
最近开始学Java,如果是程序员的话要使用Java——需要安装JDK。 不同操作系统(Win/Linux/Mac)——需要安装不同的JDK。 1.JDK安装官网链接: Java Downloads | Oracle 我的电脑是win x64,以下笔记总结就暂且以本人电脑操作系统版本…...
Spark 弹性分布式数据集 RDD
1.RDD简介 `RDD` 全称为 Resilient Distributed Datasets,是 Spark 最基本的数据抽象,它是只读的、分区记录的集合,支持并行操作,可以由外部数据集或其他 RDD 转换而来,它具有以下特性: 一个 RDD 由一个或者多个分区(Partitions)组成。对于 RDD 来说,每个分区会被一个…...
电脑被删除的文件怎么恢复?2023年数据恢复方法分享
大多数人在使用电脑时都可能会遇到误删文件的情况。一不小心,重要的文件或数据就消失了,情急之下,大多会感到慌乱和无助。但其实,文件误删除并非不可挽回的灾难。本文将为大家介绍几种有效的文件恢复方法,以帮助大家在…...
李宏毅 2022机器学习 HW3 boss baseline 上分记录
作业数据是所有数据都有标签的版本。 李宏毅 2022机器学习 HW3 boss baseline 上分记录 1. 训练数据增强2. cross validation&ensemble3. test dataset augmentation4. resnet 1. 训练数据增强 结论:训练数据增强、更长时间的训练、dropout都证明很有效果&…...
SpringBatch适配不同数据库的两种方法
一、配置JobRepository Configuration EnableBatchProcessing public class TaskArrangeConfig extends DefaultBatchConfigurer {Autowiredprivate DataSource dataSource;Autowiredprivate JobLauncher jobLauncher;Autowiredprivate JobExplorer jobExplorer;Autowiredpriv…...
【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】
文章目录 1.1 什么是 CI-700?1.1.1 关于 CI-7001.1.2 CI-700 特点1.2 全局配置参数1.2.1 寻址能力1.3 组件和配置1.3.1 CI-700 互联的结构1.3.2 Crosspoint(XP)1.3.3 外部接口1.4 组件(Components)1.1 什么是 CI-700? CI-700是一种AMBA 5 CHI互连,具有可定制的网状拓扑结构…...
找不到msvcp140_1.dll怎么办,快速解决msvcp140_1.dll问题的方法分享
在日常使用计算机的过程中,经常会遇到一些程序无法正常运行的问题,其中最常见的就是“msvcp140_1.dll丢失”。这是一个典型的DLL文件丢失问题,但背后的原因却往往并不简单。通过深入研究这个问题,我对其有了更深入的理解。 首先&a…...
华为云云耀云服务器L实例评测|部署私有网盘 Nextcloud
华为云云耀云服务器L实例评测|部署私有网盘 Nextcloud 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 应用场景 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Nextcloud3.1 Nextcloud 介绍3.2 Docker 环境搭建3.3 Nex…...
vue3中使用插件vite-plugin-svg-icons
在vue3 vite 项目中使用svg图标 插件:vite-plugin-svg-icons 预加载 在项目运行时就生成所有图标,只需操作一次 dom高性能 内置缓存,仅当文件被修改时才会重新生成 安装 yarn add vite-plugin-svg-icons -D # or npm i vite-plugin-svg-icons -D # or pnpm inst…...
面试题20231008
前端 2023年前端面试题汇总-CSDN博客 后端 1.Java基础 容器、线程等等 a.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。 JRE:Java Runtime Envir…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
