单例模式的多种实现方式及其在框架中的使用

news/2024/9/24 10:18:26/

引言

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。单例模式通常用于需要控制实例数目的场景,例如日志管理、数据库连接等。在金融业务中,单例模式可以用于实现配置管理、缓存等功能。本文将介绍单例模式在金融业务中的使用,并探讨其在Spring框架中的实现方式。

设计原理

单例模式主要涉及以下几个角色:

  1. 单例类(Singleton Class):包含一个私有的静态实例和一个公有的静态方法,用于返回这个实例。

类图

下图展示了单例模式的类图:

Singleton
- uniqueInstance: Singleton
-Singleton()
+getInstance()

单例模式的实现

1. 懒汉式单例(Lazy Initialization)

懒汉式单例模式在第一次需要使用实例时进行创建。它的实现简单,但在多线程环境下可能会有问题。

java">public class Singleton {private static Singleton uniqueInstance;private Singleton() {// 私有构造函数,防止实例化}public static Singleton getInstance() {if (uniqueInstance == null) {uniqueInstance = new Singleton();}return uniqueInstance;}
}
2. 饿汉式单例(Eager Initialization)

饿汉式单例模式在类加载时就创建实例。它的实现简单且线程安全,但在实例化开销较大时会导致资源浪费。

java">public class Singleton {private static final Singleton uniqueInstance = new Singleton();private Singleton() {// 私有构造函数,防止实例化}public static Singleton getInstance() {return uniqueInstance;}
}
3. 双重检查锁(Double-Checked Locking)

双重检查锁解决了懒汉式单例在多线程环境下的问题,保证了线程安全和高效性。

java">public class Singleton {private static volatile Singleton uniqueInstance;private Singleton() {// 私有构造函数,防止实例化}public static Singleton getInstance() {if (uniqueInstance == null) {synchronized (Singleton.class) {if (uniqueInstance == null) {uniqueInstance = new Singleton();}}}return uniqueInstance;}
}
4. 静态内部类(Static Inner Class)

静态内部类实现单例模式,既保证了线程安全,又保证了延迟加载。

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

单例模式在Spring框架中的应用

Spring Bean 的单例模式

在Spring框架中,默认情况下,Spring Bean是单例的。这意味着Spring容器中只有一个Bean实例,所有请求都共享这个实例。

1. Spring Bean 配置示例
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 定义一个单例 Bean --><bean id="singletonBean" class="com.example.SingletonBean" scope="singleton"/>
</beans>
2. 使用单例 Bean 示例
java">public class SingletonBean {public void doSomething() {System.out.println("SingletonBean is doing something.");}
}// 客户端代码
public class SpringSingletonDemo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");SingletonBean bean1 = context.getBean("singletonBean", SingletonBean.class);SingletonBean bean2 = context.getBean("singletonBean", SingletonBean.class);bean1.doSomething();bean2.doSomething();System.out.println(bean1 == bean2); // 输出:true}
}

总结

单例模式在金融业务中具有广泛的应用,可以灵活地实现配置管理、缓存等功能。在Spring框架中,单例模式通过默认的Bean Scope得到了广泛应用,使得系统更具灵活性和可扩展性。

参考文献

  • Refactoring Guru - Singleton Pattern
  • Spring Documentation - Bean Scopes

互动与反馈

如果你觉得这篇文章对你有帮助,请点赞、收藏并关注我,以便获得更多优质内容!如有疑问或建议,欢迎在评论区留言,我会及时回复。感谢阅读!

希望这对你有帮助!如果你有其他设计模式需要了解,请告诉我。


http://www.ppmy.cn/news/1474193.html

相关文章

代码随想录算法训练营:20/60

非科班学习算法day20 | LeetCode235:二叉搜索树的最近公共祖先 &#xff0c;Leetcode701:二叉树的插入操作 &#xff0c;Leetcode450:删除二叉搜索树的节点 介绍 包含LC的两道题目&#xff0c;还有相应概念的补充。 相关图解和更多版本&#xff1a; 代码随想录 (programmer…

SDK游戏盾、高防IP和高防CDN有什么区别

SDK 游戏盾、高防 IP 和高防 CDN 主要有以下区别&#xff1a; SDK 游戏盾&#xff1a; • 原理&#xff1a;通常需要集成到游戏应用程序中&#xff0c;通过在游戏客户端和服务器之间建立加密通道和智能调度&#xff0c;实现对游戏的防护。 • 特点&#xff1a;能更深入地与游…

Pearson 相关系数的可视化辅助判断和怎么用

Pearson 相关系数的可视化辅助判断和怎么用 flyfish Pearson 相关系数 是一种用于衡量两个连续型变量之间线性相关程度的统计量。其定义为两个变量协方差与标准差的乘积的比值。公式如下&#xff1a; r ∑ ( x i − x ˉ ) ( y i − y ˉ ) ∑ ( x i − x ˉ ) 2 ∑ ( y i −…

golang编译成Linux可运行文件

把Windows环境修改为linux&#xff0c;修改完成后&#xff0c;编译的go程序就是linux可运行文件 # cmd set GOARCHamd64 go env -w GOARCHamd64 set GOOSlinux go env -w GOOSlinux还原成windows环境 # 还原 go env -w GOARCHamd64 go env -w GOOSwindows注意&#xff1a; 这…

Python从0到100(三十六):字符和字符集基础知识及其在Python中的应用

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

论文 | Measuring and Narrowing the Compositionality Gap in Language Models

存在的问题&#xff1a; 关于一个复杂的多跳问题&#xff0c;大语言模型可以正确回答基于该问题分解的多个子问题&#xff0c;但是对于这个问题的最终答案大语言模型可能最终还是给不出来正确的。该论文根据这个现象提出了一个术语&#xff0c;叫“组合性差距”。 解决的方法&…

【前端从入门到精通:第二课:HTML头部标签常用标签】

走进HTML世界 HTML简介 可参考百度百科 学习变成到底难不难&#xff1f; A. 1 * 5 ? B. 111 * 555 ? A 到 B的过程&#xff0c; 差距就在于动手&#xff0c;不动手你就学不会。 如何创建HTML文件 ​鼠标右键->新建文本文件->更改后缀名.html 创建文件所需要注…

PostgreSQL数据库常用函数用法介绍

本文将介绍一些PostgreSQL中常用的函数&#xff0c;包括其用途、参数说明、使用示例、测试用例&#xff0c;以及一些复杂函数的使用。 1. length() 用途 计算字符串的长度。 参数说明 text&#xff1a;需要计算长度的字符串。 使用示例 SELECT length(PostgreSQL);输出&…