【单例模式】—— 每天一点小知识

在这里插入图片描述

                                                                              💧 单例模式 \color{#FF1493}{单例模式} 单例模式💧          


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

  • 🐳设计模式之单例模式
    • 引言
    • 单例模式的概念和思想
    • 饿汉式
    • 懒汉式
    • 双重检查
    • 静态内部类
    • 枚举
    • 总结
  • 🐳结语


🐳设计模式之单例模式

引言

设计模式是软件开发中重要的概念之一。单例模式是设计模式中的一种,它用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在本文中,我们将深入探讨单例模式的概念和思想,并介绍几种常见的代码实现方式。


单例模式的概念和思想

  💧单例模式是一种创建型设计模式,其主要目的是限制一个类只能有一个实例,并提供一种访问该实例的方式。这对于需要共享资源控制特定资源访问的场景非常有用。

  💧单例模式的核心思想通过封装构造函数,使得该类无法通过常规的方式创建实例。同时,单例模式还提供一个静态方法或者全局变量来获取该类的唯一实例

常见的代码实现方式 ↓

饿汉式

  💧饿汉式是最简单的单例模式实现方式之一。在该实现中,实例在类加载时就被创建,因此称为"饿汉式"。

public class Singleton {private static Singleton instance = new Singleton();private Singleton() {// 私有构造函数}public static Singleton getInstance() {return instance;}
}

在上述代码中,我们通过私有的构造函数确保该类无法在外部被实例化。同时,通过静态变量 instance 保存唯一实例,并通过静态方法 getInstance() 返回该实例。

懒汉式

  💧懒汉式是另一种常见的单例模式实现方式。与饿汉式不同,懒汉式在需要时才创建实例。

public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

在上述代码中,我们将实例的创建延迟到第一次调用 getInstance() 方法时。这种方式在多线程环境下可能会出现问题,因为多个线程可能同时调用 getInstance() 方法,导致创建多个实例。下面我们将介绍一种改进的懒汉式实现方式。

双重检查

  💧双重检查是一种改进的懒汉式实现方式,通过添加同步块来确保只有一个线程能够创建实例。

public class Singleton {private static volatile Singleton instance = null;```javaprivate Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

在上述代码中,我们首先检查实例是否已经存在,如果不存在,则进入同步块。在同步块内部,再次检查实例是否为空,如果为空,则创建实例。通过使用 volatile 关键字修饰 instance 变量,确保在多线程环境下对变量的可见性,避免出现创建多个实例的情况。

静态内部类

  💧静态内部类是一种常见的延迟初始化的单例模式实现方式。在该实现中,使用内部类来持有实例,并在需要时进行初始化。

public class Singleton {private Singleton() {// 私有构造函数}private static class SingletonHolder {private static final Singleton instance = new Singleton();}public static Singleton getInstance() {return SingletonHolder.instance;}
}

在上述代码中,我们将实例的创建放在了静态内部类 SingletonHolder 中。当调用 getInstance() 方法时,会返回 SingletonHolder 中的实例,从而实现了延迟初始化的效果。这种方式利用了类加载的机制来保证线程安全,同时又避免了同步块带来的性能开销。

枚举

  💧枚举是一种简洁且安全的单例模式实现方式。在枚举中,每个枚举常量都是该枚举类型的一个实例。

public enum Singleton {INSTANCE;// 添加其他成员和方法
}

在上述代码中,我们使用了一个单独的枚举常量 INSTANCE 来表示该单例的实例。通过直接访问枚举常量 INSTANCE,可以获取到该实例。枚举的特性保证了该实例是全局唯一的,同时也提供了线程安全的保证。

总结

通过使用单例模式,我们可以确保一个类只有一个实例,并提供全局访问点来获取该实例。这在需要共享资源或控制资源访问的场景下非常有用。我们在使用单例模式时也需要注意线程安全和性能等方面的考虑。


在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9018.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于卷积变分自动编码器的3D数据处理与重建【CVAE】

在这个项目中,我们将学习如何使用卷积变分自动编码器 (CVAE) 来处理和重建 3D 湍流数据。 我们使用计算流体动力学 (CFD) 方法生成 3D 湍流立方体,每个 3D 立方体沿着三个速度分量携带物理信息(与图像数据类似,被视为单独的通道&…

Http host 标头攻击

一、什么是http host 标头攻击 HTTP Host 标头攻击是一种网络安全攻击技术,利用了 HTTP 协议中的 Host 标头字段的漏洞。Host 标头字段用于指定客户端请求的目标主机名或域名。 攻击者可以通过构造恶意的 HTTP 请求,伪造或篡改 Host 标头字段的值&#x…

Linux系统安全:安全技术和防火墙

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Linux系统安全:安全技术和防火墙1.安全技术:2.入侵防御系统 (Intrusion Prevention System) :3.防火墙 ( Erewall ) :4.防水墙&#xff…

GPT模型训练实践(3)-参数训练和代码实践

一、参数训练 GPT模型参数的训练过程宏观上有两个大环节,先从上往下进行推理,再从下往上进行训练,具体过程为: 1、模型初始化参数随机取得; 2、计算模型输出与真实数据的差距(损失值和梯度) …

Linux 6.5增加对高通开源GPU Adreno 690的支持

导读即将推出的Linux 6.5内核将把对高通Adreno 690 GPU的支持添加到开源的MSM内核图形/显示驱动程序中。A690主要用于骁龙8cx第三代(SC8280XP)平台,而联想ThinkPad X13s笔记本电脑和其他硬件也采用了该平台。 新的支持将包含近200行代码&…

JS数据分组引发的思考

我们经常需要对数据进行分组(分类),得到需要的格式。 1.简单示例 例如有一份对象数组的数据 const data [{ name: Liam, age: 18, sex: male },{ name: Bob, age: 20, sex: male },{ name: Diana, age: 21, sex: female },{ name: Grace, age: 20, sex: female }…

【云原生丶Kubernetes】Kubernetes初体验

人生若只如初见,何事秋风悲画扇。 前言 Kubernetes 是目前最流行的容器编排工具之一,由Google开发并维护。它提供了完整的容器编排解决方案,包括自动化部署、资源管理和调度、服务发现和负载均衡等功能。 然而,对于初学者来说&a…

【Linux】文件描述符(下篇)

文章目录 📖 前言1. 文件描述符fd的分配规则2. 重定向的本质3. 缓冲区的理解3.1 感受缓冲区的存在:3.2 正式认识缓冲区:综合例题: 4. 模拟实现C语言的文件操作5. 完善之前实现的shell5.1 程序替换,会影响曾经子进程打开…

决策树 ID3 手工推导

掌握决策树ID3算法的原理,通过增益熵实现手工推导的过程。 参考案例:https://cuijiahua.com/blog/2017/11/ml_2_decision_tree_1.html 机器学习实战教程(二):决策树基础篇之让我们从相亲说起 决策树 ID3 手工推导 决策树 ID3 简介 ID3作为一种…

多个微信号如何管理?

很多公司都在发愁这几个问题: 1、拥有多个微信号,不想管理多台手机,想将所有微信号进行统一管理 2、想用软件来代替传统的营销体系,安全性上也要有保障 3、用人成本太大与公司的效益不成正比 4、多个账号发圈不方便&#xff0…

Neo4j docker 部署

想要运行简单测试一下neo4j,就直接使用docker创建了一个容器,并用cypher-shell本地连接neo4j,创建图进行测试。 1 开启docker sudo systemctl start docker2 拉取镜像源 sudo docker pull neo4j # 默认latest版本3 查看本地镜像&#xff0…

ElasticSearch学习02——Kibana安装

ElasticSearch学习02——Windows下Kibana安装 Kibana是界面化的查询数据的工具,下载时尽量下载与ElasicSearch一致的版本。 1、下载对应版本的Kibana ​ 有了ElasticSearch安装的经验,我们发现了ES和JDK有着版本对应的关系,Kibana和ES共同为…