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

单例模式:确保唯一实例的设计模式

前言

在学习框架和大型项目开发时,我们常常会遇到“单例模式”这个词。虽然它时常被提及,但往往没有详细讲解。为了搞懂单例模式的真正意义以及它在开发中的应用,我查阅了一些资料并总结了这篇博客。希望通过这篇文章,能够帮助大家更好地理解单例模式,并在实际开发中得心应手地运用它。

单例模式的由来

单例模式(Singleton Pattern)是设计模式中的一种,最早由Erich Gamma等人提出并应用于软件设计中。单例模式的核心思想很简单:确保一个类只有一个实例,并提供一个全局访问点。

最初,单例模式的概念源于在操作系统中对唯一资源的管理,例如配置文件或数据库连接。这种模式能够有效避免资源的重复创建,从而提高系统的性能和资源利用率。

单例模式的定义

单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并且提供一个全局的访问点。简单来说,就是一个类的实例是唯一的,所有请求这个实例的地方都得到相同的对象。

可以将单例模式比作家庭中的家庭医生:全家只有一个医生,所有的健康问题都由他来处理。虽然你可以去其他地方看病,但在你家庭中,那个医生是唯一的,不会有第二个。

单例模式的实现方式

实现单例模式有多种方式,下面是常见的几种:

  1. 懒汉式(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;}
    }

    优点:节省了内存,因为实例只在第一次使用时创建。
    缺点:需要同步控制,可能影响性能。

  2. 饿汉式(Eager Initialization)

    饿汉式单例模式在类加载时就创建实例,无论是否使用,实例都会被创建。实现代码如下:

    public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {// 私有构造函数,防止外部创建实例}public static Singleton getInstance() {return instance;}
    }

    优点:实现简单,线程安全。
    缺点:类加载时就创建实例,可能浪费内存,特别是当实例很大的时候。

  3. 双重检查锁(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 题目&#xff1a; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1…...

SpringBoot+Mybatis 分页

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

学习进行到了第十七天(2024.8.5)

1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射&#xff0c;可以…...

【Nuxt】Layout 布局和渲染模式

NuxtLayout app.vue <NuxtLayout><NuxtPage/></NuxtLayout>然后默认的布局 需要 写在 ~/layouts/default.vue 下面&#xff0c;其他自定义的布局也在写在 layouts 目录下。 default.vue <template><div class"app-container"><d…...

C:指针学习(1)-学习笔记

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

【LVS】负载均衡之NAT模式

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

ASP.NET Core 基础 - 入门实例

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

机器人主板维修|ABB机械手主板元器件故障

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

大数据Flink(一百零六):什么是阿里云实时计算Flink版

文章目录 什么是阿里云实时计算Flink版 一、产品概述 二、产品架构 三、产品优势 什么是阿里云实时计算Flink版 阿里云实时计算Flink版是一套基于Apache Flink构建的⼀站式实时大数据分析平台&#xff0c;提供端到端亚秒级实时数据分析能力&#xff0c;并通过标准SQL降低业…...

ERCOT中的专业术语解释

在ERCOT中&#xff0c;ECRSM 代表的是 “Emergency Contingency Resource Supplementary Market”。这个术语涉及到紧急备用资源市场&#xff0c;用于应对电力需求或供应的紧急情况。在ERCOT电网中&#xff0c;当系统面临极端情况或资源不足时&#xff0c;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底层实现&#xff0c;一定要搞透澈&#xff0c;本章将会是持续更新 参考资料&#xff1a; Java代码实现SM2算法以及注意点总结&#xff08;踩坑记录&#xff09; 国密算法工具Smutil 一. 代码 import cn.hutool.core.uti…...

进程的等待(非阻塞轮询+阻塞)和替换控制详解

引言 在Linux系统中&#xff0c;进程管理是核心功能之一。理解进程的创建、执行和终止是系统编程中的基础。本文将深入探讨Linux中的进程控制机制&#xff0c;包括进程的生命周期、父子进程的交互、以及进程状态的管理 1. 进程创建&#xff1a;fork()函数 在Linux操作系统中…...

24/8/6算法笔记 支持向量机

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种监督学习算法&#xff0c;主要用于分类和回归任务。它基于统计学习理论中的结构风险最小化原理&#xff0c;通过找到数据点之间的最优边界来实现模型的泛化能力。 import numpy as np import matplotlib.…...

测试用例等级划分

基本等级&#xff08;‌Level 1或P0&#xff09;‌&#xff1a;‌这类用例设计系统基本功能&#xff0c;‌执行失败会导致多处重要功能无法运行。‌例如&#xff0c;‌单表维护中的增加功能、‌最平常的业务使用等&#xff0c;‌这些是发生概率较高的功能用例。‌这类用例在每一…...

打造Perl编译器前端:自定义语言处理的魔法

打造Perl编译器前端&#xff1a;自定义语言处理的魔法 Perl是一种强大而灵活的编程语言&#xff0c;它提供了丰富的文本处理能力&#xff0c;使其成为实现自定义编译器前端的理想选择。编译器前端通常负责源代码的词法分析、语法分析和语义分析。本文将详细介绍如何在Perl中实…...

Visual Studio 和 Visual Studio Code 的比较与应用偏向

Visual Studio 和 Visual Studio Code&#xff08;VS Code&#xff09;是微软开发的两个不同的开发工具&#xff0c;各有特点和优势&#xff0c;适用于不同的开发需求。下面是详细的比较和在实际应用中的偏向。 功能和特性 Visual Studio 完整的IDE&#xff1a;支持多种编程…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...