单例模式:确保唯一实例的设计模式
前言
在学习框架和大型项目开发时,我们常常会遇到“单例模式”这个词。虽然它时常被提及,但往往没有详细讲解。为了搞懂单例模式的真正意义以及它在开发中的应用,我查阅了一些资料并总结了这篇博客。希望通过这篇文章,能够帮助大家更好地理解单例模式,并在实际开发中得心应手地运用它。
单例模式的由来
单例模式(Singleton Pattern)是设计模式中的一种,最早由Erich Gamma等人提出并应用于软件设计中。单例模式的核心思想很简单:确保一个类只有一个实例,并提供一个全局访问点。
最初,单例模式的概念源于在操作系统中对唯一资源的管理,例如配置文件或数据库连接。这种模式能够有效避免资源的重复创建,从而提高系统的性能和资源利用率。
单例模式的定义
单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并且提供一个全局的访问点。简单来说,就是一个类的实例是唯一的,所有请求这个实例的地方都得到相同的对象。
可以将单例模式比作家庭中的家庭医生:全家只有一个医生,所有的健康问题都由他来处理。虽然你可以去其他地方看病,但在你家庭中,那个医生是唯一的,不会有第二个。
单例模式的实现方式
实现单例模式有多种方式,下面是常见的几种:
-
懒汉式(Lazy Initialization)
懒汉式单例模式是在第一次调用
getInstance()
方法时创建实例,之后每次调用都返回同一个实例。实现代码如下:public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数,防止外部创建实例}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;} }
优点:节省了内存,因为实例只在第一次使用时创建。
缺点:需要同步控制,可能影响性能。 -
饿汉式(Eager Initialization)
饿汉式单例模式在类加载时就创建实例,无论是否使用,实例都会被创建。实现代码如下:
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {// 私有构造函数,防止外部创建实例}public static Singleton getInstance() {return instance;} }
优点:实现简单,线程安全。
缺点:类加载时就创建实例,可能浪费内存,特别是当实例很大的时候。 -
双重检查锁(Double-Checked Locking)
双重检查锁定是为了在多线程环境中提高性能,它在
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;} }
优点:高效,线程安全。
缺点:实现较复杂,需要处理线程安全的问题。
单例模式的应用场景
单例模式在实际开发中有广泛的应用,主要包括:
- 配置管理器:确保配置文件的读取和修改操作由唯一的实例进行。
- 日志记录器:一个应用程序通常只有一个日志记录器实例,用于记录日志。
- 数据库连接池:在需要进行数据库操作时,确保使用同一个数据库连接池,避免重复创建连接。
总结
单例模式是一种确保类只有一个实例的设计模式,它在很多实际应用场景中都发挥了重要作用。从配置管理到日志记录,单例模式通过保证唯一性,避免了资源的重复创建,提高了系统的性能和效率。希望通过这篇博客,大家能够对单例模式有一个清晰的认识,并能够在实际开发中灵活运用它。记住,像家庭医生一样,单例模式的目标是确保系统中只有一个唯一的“实例”,让你的应用程序运行得更加高效!
相关文章:
单例模式:确保唯一实例的设计模式
前言 在学习框架和大型项目开发时,我们常常会遇到“单例模式”这个词。虽然它时常被提及,但往往没有详细讲解。为了搞懂单例模式的真正意义以及它在开发中的应用,我查阅了一些资料并总结了这篇博客。希望通过这篇文章,能够帮助大…...
MCU调试技巧-串口打印
1. 软件仿真printf 条件:MDK 效果:在软件仿真模式下,调试页面的串口终端中可以看到串口打印 教程:https://blog.csdn.net/ybhuangfugui/article/details/94378195 2. 串口重定向printf 条件:物理串口接线 效果&…...

VS+Qt+C++点云PCL三维显示编辑系统
程序示例精选 VSQtC点云PCL三维显示编辑系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VSQtC点云PCL三维显示编辑系统》编写代码,代码整洁,规则,易…...

代码随想录算法训练营第七天(一)| 454.四数相加II 383. 赎金信
454.四数相加II 题目: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1࿱…...

SpringBoot+Mybatis 分页
无论多数据源,还是单数据源,分页都一样,刚开始出了点错,是因为PageHelper的版本问题 这里用的SpringBoot3 SpringBoot2应该是没有问题的 相关代码 dynamic-datasourceMybatis多数据源使用-CSDN博客 依赖 <?xml version"1.0" encoding"UTF-8"?&g…...

学习进行到了第十七天(2024.8.5)
1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射,可以…...

【Nuxt】Layout 布局和渲染模式
NuxtLayout app.vue <NuxtLayout><NuxtPage/></NuxtLayout>然后默认的布局 需要 写在 ~/layouts/default.vue 下面,其他自定义的布局也在写在 layouts 目录下。 default.vue <template><div class"app-container"><d…...

C:指针学习(1)-学习笔记
目录 前言: 知识回顾: 1、const 1.1 const修饰普通变量 1.2 const修饰指针变量 1.3 总结: 2、指针运算 2.1 指针-整数 2.2 指针-指针 2.3 指针的关系运算 3、指针的使用 结语: 前言: 距离上一次更新关于初…...

【LVS】负载均衡之NAT模式
一、LVS概念 LVS(Linux Virtual Server)是一个基于Linux操作系统的虚拟服务器技术,用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上,从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…...

ASP.NET Core 基础 - 入门实例
一. 下载 1. 下载vs2022 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 学生,个人开发者选择社区版就行,免费的. 安装程序一直下一步下一步就行,别忘了选择安装位置,如果都放在C盘的话,就太大了. 2. 选择工作负荷 准备工作完成 二. 创建新项目 三…...

机器人主板维修|ABB机械手主板元器件故障
【ABB机器人电路板故障原因诊断】 针对上述故障现象,我们需要对ABB机器人IO板进行详细的故障诊断。以下是一些可能的故障原因: 1. 元器件老化或损坏:ABB机械手安全面板上的元器件在长期使用过程中可能出现老化、损坏或接触不良等问题…...

大数据Flink(一百零六):什么是阿里云实时计算Flink版
文章目录 什么是阿里云实时计算Flink版 一、产品概述 二、产品架构 三、产品优势 什么是阿里云实时计算Flink版 阿里云实时计算Flink版是一套基于Apache Flink构建的⼀站式实时大数据分析平台,提供端到端亚秒级实时数据分析能力,并通过标准SQL降低业…...
ERCOT中的专业术语解释
在ERCOT中,ECRSM 代表的是 “Emergency Contingency Resource Supplementary Market”。这个术语涉及到紧急备用资源市场,用于应对电力需求或供应的紧急情况。在ERCOT电网中,当系统面临极端情况或资源不足时,ECRSM 可以帮助确保电…...

Python酷库之旅-第三方库Pandas(069)
目录 一、用法精讲 276、pandas.Series.dt.is_quarter_start属性 276-1、语法 276-2、参数 276-3、功能 276-4、返回值 276-5、说明 276-6、用法 276-6-1、数据准备 276-6-2、代码示例 276-6-3、结果输出 277、pandas.Series.dt.is_quarter_end属性 277-1、语法 …...
基于hutools的国密SM2、3、4
文章目录 前言一. 代码 前言 最近还要深度研究hutools底层实现,一定要搞透澈,本章将会是持续更新 参考资料: Java代码实现SM2算法以及注意点总结(踩坑记录) 国密算法工具Smutil 一. 代码 import cn.hutool.core.uti…...

进程的等待(非阻塞轮询+阻塞)和替换控制详解
引言 在Linux系统中,进程管理是核心功能之一。理解进程的创建、执行和终止是系统编程中的基础。本文将深入探讨Linux中的进程控制机制,包括进程的生命周期、父子进程的交互、以及进程状态的管理 1. 进程创建:fork()函数 在Linux操作系统中…...

24/8/6算法笔记 支持向量机
支持向量机(Support Vector Machine, SVM)是一种监督学习算法,主要用于分类和回归任务。它基于统计学习理论中的结构风险最小化原理,通过找到数据点之间的最优边界来实现模型的泛化能力。 import numpy as np import matplotlib.…...
测试用例等级划分
基本等级(Level 1或P0):这类用例设计系统基本功能,执行失败会导致多处重要功能无法运行。例如,单表维护中的增加功能、最平常的业务使用等,这些是发生概率较高的功能用例。这类用例在每一…...
打造Perl编译器前端:自定义语言处理的魔法
打造Perl编译器前端:自定义语言处理的魔法 Perl是一种强大而灵活的编程语言,它提供了丰富的文本处理能力,使其成为实现自定义编译器前端的理想选择。编译器前端通常负责源代码的词法分析、语法分析和语义分析。本文将详细介绍如何在Perl中实…...

Visual Studio 和 Visual Studio Code 的比较与应用偏向
Visual Studio 和 Visual Studio Code(VS Code)是微软开发的两个不同的开发工具,各有特点和优势,适用于不同的开发需求。下面是详细的比较和在实际应用中的偏向。 功能和特性 Visual Studio 完整的IDE:支持多种编程…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...