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

【GoF23种设计模式】02_单例模式(Singleton Pattern)

文章目录

  • 前言
  • 一、什么是单例模式?
  • 二、为什么要用单例模式?
  • 三、如何实现单例模式?
  • 总结


前言

提示:设计者模式有利于提高开发者的编程效率和代码质量:

GoF(Gang of Four,四人帮)设计模式由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者合著,介绍了23种经典的设计模式。
分为三大类:创建型模式、结构型模式和行为型模式。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是单例模式?

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取这个实例。这通常用于需要集中控制或管理资源的场景,例如数据库连接、线程池、配置文件读取等。

二、为什么要用单例模式?

使用单例模式的原因包括但不限于以下几点:

  • 资源控制:确保系统中某个资源仅有一个实例,避免资源浪费或冲突。
  • 全局访问:提供一个全局访问点,使得系统中的任何部分都可以方便地访问该实例。
  • 节省内存:因为只有一个实例存在,所以可以节省系统资源,特别是当对象占用大量内存时。
  • 状态共享:对于需要在多个地方共享状态的情况,单例模式可以确保状态的一致性。
  • 初始化成本高:如果对象的创建过程非常复杂或者耗时,那么使用单例模式可以在第一次使用时才进行创建,从而延迟初始化,提高性能。

三、如何实现单例模式?

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

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;}
}

优点:实现了真正的懒加载,即只有在真正需要的时候才会创建实例。

缺点:每次调用 getInstance 方法都需要进行同步,这可能会带来性能问题。

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)
双重检查锁定是一种优化过的懒汉式实现,减少了不必要的同步操作,提高了性能。

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;}
}

优点:既实现了懒加载,又避免了每次调用 getInstance 时都进行同步,性能较高。

缺点:实现稍微复杂一些,而且需要理解Java内存模型和volatile关键字的作用。

4、静态内部类(Static Inner Class)
静态内部类是另一种实现懒加载的方式,利用了类加载机制确保线程安全。(常用)

public class Singleton {private Singleton() {} // 私有构造函数防止外部实例化private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

优点:线程安全,且实现了懒加载,性能良好,代码简洁。

缺点:与其它方式相比,可能不是最直观的理解方式。


总结

选择哪种实现方式取决于具体的应用场景和需求,后期会新增关于单例模式的具体应用场景。

相关文章:

【GoF23种设计模式】02_单例模式(Singleton Pattern)

文章目录 前言一、什么是单例模式?二、为什么要用单例模式?三、如何实现单例模式?总结 前言 提示:设计者模式有利于提高开发者的编程效率和代码质量: GoF(Gang of Four,四人帮)设计…...

UniApp:uni-segmented-control 自定义布局

自定义tabs选项&#xff0c;items 为tabs名称数组&#xff0c;横向滚动 <scroll-view scroll-x><view class"segmented-control"><view v-for"(item, index) in items" :key"index" class"control-item ":class"…...

【算法day17-day18】回溯:解决组合问题

不好意思呀各位&#xff0c;最近在忙期末考今天才彻底结束&#xff0c;来让我们继续算法之路吧~ 题目引用 组合电话号码的字母组合组合总和组合总和II分割回文串 1.组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回…...

从监控异常发现网络安全

前言 最近在前端异常监控系统中&#xff0c;发现一些异常信息&#xff0c;从中做了一些分析&#xff0c;得到一些体会&#xff0c;因此作文。 发现异常 某天早上打开监控系统发现&#xff0c;当天凌晨1点过测试环境有2个前端上报的异常&#xff0c;报错的原因都是由于没有获取…...

Qt之自定义标题栏拓展(十)

Qt开发 系列文章 - user-defined-titlebars&#xff08;十&#xff09; 目录 前言 一、方式一 1.效果演示 2.创建标题栏类 3.可视化UI设计 4.定义相关函数 5.使用标题栏类 二、方式二 1.效果演示 2.创建标题栏类 3.定义相关函数 1.初始化函数 2.功能函数 3.窗口关…...

Verilog中initial的用法

在 Verilog 语言中&#xff0c;initial 语句用于在仿真开始时执行一次性初始化操作。它是顺序执行的&#xff0c;用来描述在仿真启动时立即运行的代码块&#xff0c;通常用于赋初值、生成波形或控制信号行为。 语法 initial begin // 语句1 // 语句2 ... end特点 只…...

(14)D-FINE网络,爆锤yolo系列

yolo过时了&#xff1f;传统的yolo算法在小目标检测方面总是不行&#xff0c;最新算法DEIM爆锤yolo&#xff0c;已经替yolo解决。 一、创新点 ​ 这个算法名为DEIM&#xff0c;全称是DETR with Improved Matching for Fast Convergence&#xff0c;其主要创新点在于提出了一…...

Python :冬至快乐

第1部分&#xff1a;基础设置 首先创建一个新的 Python 文件&#xff0c;命名为 fireworks.py。 步骤 1.1: 导入必要的库 import pygame import random import sys from pygame.locals import * import math import time这些库的作用&#xff1a; pygame: 用于创建游戏和图…...

重拾设计模式--状态模式

文章目录 状态模式&#xff08;State Pattern&#xff09;概述状态模式UML图作用&#xff1a;状态模式的结构环境&#xff08;Context&#xff09;类&#xff1a;抽象状态&#xff08;State&#xff09;类&#xff1a;具体状态&#xff08;Concrete State&#xff09;类&#x…...

稀疏矩阵的存储与计算 gaxpy

1, gaxpy 数学公式 其中&#xff1a; &#xff0c; &#xff0c; 2, 具体实例 3&#xff0c;用稠密矩阵的方法 本节将用于验证第4节中的稀疏计算的结果 hello_gaxpy_dense.cpp #include <stdio.h> #include <stdlib.h>struct Matrix_SP {float* val; //…...

基于LabVIEW的USRP信道测量开发

随着无线通信技术的不断发展&#xff0c;基于软件无线电的设备&#xff08;如USRP&#xff09;在信道测量、无线通信测试等领域扮演着重要角色。通过LabVIEW与USRP的结合&#xff0c;开发者可以实现信号生成、接收及信道估计等功能。尽管LabVIEW提供了丰富的信号处理工具和图形…...

基于LSTM长短期记忆神经网络的多分类预测【MATLAB】

在深度学习中&#xff0c;长短期记忆网络&#xff08;LSTM, Long Short-Term Memory&#xff09;是一种强大的循环神经网络&#xff08;RNN&#xff09;变体&#xff0c;专门为解决序列数据中的长距离依赖问题而设计。LSTM因其强大的记忆能力&#xff0c;广泛应用于自然语言处理…...

物联网:全面概述、架构、应用、仿真工具、挑战和未来方向

中文论文标题&#xff1a;物联网&#xff1a;全面概述、架构、应用、仿真工具、挑战和未来方向 英文论文标题&#xff1a;Internet of Things: a comprehensive overview, architectures, applications, simulation tools, challenges and future directions 作者信息&#x…...

volatility2工具的使用vol2工具篇

vol2工具 命令格式&#xff1a;vol.py -f [image] --profile[profile] [plugin] 1、查看系统的操作版本&#xff0c;系统镜像信息 2.查看用户名密码信息&#xff0c;当前操作系统中的password hash&#xff0c;例如SAM文件内容 3.从注册表提取LSA密钥信息&#xff08;已解密&…...

R 基础运算

R 基础运算 R 是一种广泛使用的统计编程语言&#xff0c;它提供了强大的数据操作和分析功能。基础运算在 R 中非常重要&#xff0c;因为它们是进行更复杂计算和数据分析的基础。本文将详细介绍 R 中的基础运算&#xff0c;包括算术运算、逻辑运算、向量化和矩阵运算。 一、算…...

javaScriptBOM

1.1、BOM概述 1.1.1、BOM简介 BOM&#xff08;browser Object&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window。 BOM由一系列的对象构成&#xff0c;并且每个对象都提供了很多方法与属性 BOM缺乏标准…...

Godot RPG 游戏开发指南

Godot RPG 游戏开发指南 一、基础准备 1. 开发环境 下载并安装最新版 Godot 4.x选择使用 GDScript 或 C# 作为开发语言准备基础美术资源&#xff08;角色、地图、道具等&#xff09; 2. 项目结构 project/ ├── scenes/ # 场景文件 ├── scripts/ # 脚…...

目标检测数据集图片及标签同步旋转角度

前言 在深度学习领域&#xff0c;尤其是目标检测任务中&#xff0c;数据集的质量直接影响模型的性能。为了提升模型的鲁棒性和对各种场景的适应能力&#xff0c;数据增强技术被广泛应用于图像数据集处理。旋转角度是常见的数据增强方法&#xff0c;通过对图像及其对应的标签&am…...

2025前端面试热门题目——计算机网络篇

计算机网络篇——面试 1. 到底什么是 TCP 连接? TCP 连接的定义 TCP&#xff08;传输控制协议&#xff09;是一个面向连接的传输层协议。TCP 连接是通过 三次握手 确立的可靠数据通信链路&#xff0c;保证了在不可靠网络&#xff08;如互联网&#xff09;上的数据传输的准确…...

LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS---正文

题目 最少到最多的提示使大型语言模型能够进行复杂的推理 论文地址&#xff1a;https://arxiv.org/abs/2205.10625 摘要 思路链提示在各种自然语言推理任务中表现出色。然而&#xff0c;它在需要解决比提示中显示的示例更难的问题的任务上表现不佳。为了克服这种由易到难的概括…...

Swin2SR模型可解释性:理解超分决策过程

Swin2SR模型可解释性&#xff1a;理解超分决策过程 1. 引言 当我们使用Swin2SR这样的超分辨率模型时&#xff0c;经常会惊叹于它能够将模糊的低分辨率图像转换为清晰的高分辨率图像。但你是否好奇过&#xff0c;这个"AI显微镜"是如何做出这些决策的&#xff1f;它是…...

SAM3优化指南:如何调节掩码精细度获得更好边缘效果

SAM3优化指南&#xff1a;如何调节掩码精细度获得更好边缘效果 1. 引言&#xff1a;为什么需要调节掩码精细度 在实际使用SAM3进行图像分割时&#xff0c;很多用户会遇到一个共同的问题&#xff1a;生成的物体边缘不够精细。比如分割一只猫时&#xff0c;毛发边缘显得生硬&am…...

保姆级教程:手把手配置GD32的RTC外部低速时钟(LXTAL)与内部IRC40K

GD32 RTC时钟源配置实战&#xff1a;从LXTAL到IRC40K的深度解析 在嵌入式开发中&#xff0c;实时时钟(RTC)模块的稳定运行往往决定了设备的时间记录精度和低功耗表现。作为GD32微控制器的重要外设之一&#xff0c;RTC模块支持多种时钟源配置方案&#xff0c;其中外部低速晶振(L…...

YOLO X Layout中小企业应用:无需训练,开箱即用的文档结构理解AI工具

YOLO X Layout中小企业应用&#xff1a;无需训练&#xff0c;开箱即用的文档结构理解AI工具 1. 引言&#xff1a;让文档理解变得简单高效 在日常办公中&#xff0c;我们经常需要处理各种文档——扫描的合同、拍摄的表格、电子版报告。传统方式需要人工逐个识别文档中的文字、…...

SPI通信协议与菊花链模式应用解析

四线SPI通信协议与菊花链模式应用详解1. SPI接口基础1.1 四线SPI接口定义串行外设接口(SPI)是微控制器与外围IC之间最广泛使用的通信接口之一&#xff0c;具有同步、全双工、主从式架构特点。标准四线SPI接口包含以下信号线&#xff1a;SCLK(Serial Clock)&#xff1a;时钟信号…...

Proteus仿真实战:基于STM32的波形发生器设计与实现(附源码与仿真文件)

1. 从零开始&#xff1a;STM32波形发生器的设计思路 第一次接触波形发生器项目时&#xff0c;我也被各种专业术语搞得一头雾水。后来发现&#xff0c;其实可以把STM32想象成一个音乐盒&#xff0c;DAC模块就是它的发声装置&#xff0c;而我们要做的就是教会这个音乐盒演奏不同风…...

MongoDB时间戳转换实战:从数字到标准时间格式的完整指南

1. MongoDB时间戳转换的核心概念 第一次接触MongoDB时间戳转换时&#xff0c;我也被各种时间格式搞得晕头转向。简单来说&#xff0c;MongoDB中的时间戳主要有三种存储形式&#xff1a;数字类型&#xff08;如1655448286502&#xff09;、字符串类型&#xff08;如"165544…...

如何使用铜钟音乐打造纯净无广告的个人听歌空间

如何使用铜钟音乐打造纯净无广告的个人听歌空间 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特&#xff01;(密码重置功能已回归) 项目地址: https://gitcode.com/GitHub_Trending/to/tonzhon-mus…...

AI 模型推理容器化性能优化方案

AI模型推理容器化性能优化方案 随着AI技术的快速发展&#xff0c;模型推理在生产环境中的部署需求日益增长。容器化技术凭借其轻量级、可移植性和高效资源管理的优势&#xff0c;成为AI模型部署的主流选择。在实际应用中&#xff0c;如何优化容器化AI推理的性能&#xff0c;降…...

如何用Applite轻松管理macOS应用:告别复杂的终端命令

如何用Applite轻松管理macOS应用&#xff1a;告别复杂的终端命令 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为macOS上的应用安装和更新烦恼吗&#xff1f;Applite这款…...