news 2026/4/23 16:19:39

设计模式-单例模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式-单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来访问这个实例。单例模式在软件开发中被广泛应用,特别是在那些需要严格控制实例数量,确保资源唯一性或共享资源的场景中。

1. 单例模式的特点

  • 唯一性:在整个应用程序的生命周期内,一个特定的单例类只能有一个实例。这保证了在不同部分的代码中访问的是同一个对象,避免了因创建多个实例可能导致的资源浪费或数据不一致问题。
  • 全局访问点:单例模式提供了一个全局访问点,通常是一个静态方法,使得应用程序的任何部分都可以方便地获取到这个唯一的实例。

2. 单例模式的实现方式

常见的单例模式实现方式有以下几种:

  • 饿汉式单例:在类加载时就立即创建实例,所以它是线程安全的。
publicclassEagerSingleton{// 在类加载时就创建实例privatestaticfinalEagerSingletoninstance=newEagerSingleton();// 私有构造函数,防止外部实例化privateEagerSingleton(){}// 提供全局访问点publicstaticEagerSingletongetInstance(){returninstance;}}
  • 懒汉式单例(线程不安全):在第一次调用getInstance方法时才创建实例。但这种方式在多线程环境下是不安全的,可能会创建多个实例。
publicclassLazySingleton{privatestaticLazySingletoninstance;privateLazySingleton(){}// 线程不安全的获取实例方法publicstaticLazySingletongetInstance(){if(instance==null){instance=newLazySingleton();}returninstance;}}
  • 懒汉式单例(线程安全):通过在getInstance方法上加synchronized关键字来确保线程安全,但这种方式会影响性能,因为每次调用该方法都需要进行同步操作。
publicclassThreadSafeLazySingleton{privatestaticThreadSafeLazySingletoninstance;privateThreadSafeLazySingleton(){}// 线程安全的获取实例方法publicstaticsynchronizedThreadSafeLazySingletongetInstance(){if(instance==null){instance=newThreadSafeLazySingleton();}returninstance;}}
  • 双重检查锁(DCL)单例:这是一种优化的懒汉式单例实现,既保证了线程安全,又提高了性能。它通过两次检查instance是否为null,减少了不必要的同步操作。
publicclassDoubleCheckedLockingSingleton{privatestaticvolatileDoubleCheckedLockingSingletoninstance;privateDoubleCheckedLockingSingleton(){}publicstaticDoubleCheckedLockingSingletongetInstance(){if(instance==null){synchronized(DoubleCheckedLockingSingleton.class){if(instance==null){instance=newDoubleCheckedLockingSingleton();}}}returninstance;}}

这里使用volatile关键字是为了确保instance变量的可见性,防止指令重排导致的问题。

  • 静态内部类单例:利用了类加载机制来保证线程安全,并且只有在调用getInstance方法时才会加载内部类并创建实例。
publicclassStaticInnerClassSingleton{privateStaticInnerClassSingleton(){}privatestaticclassSingletonHolder{privatestaticfinalStaticInnerClassSingletonINSTANCE=newStaticInnerClassSingleton();}publicstaticStaticInnerClassSingletongetInstance(){returnSingletonHolder.INSTANCE;}}

3. 单例模式的适用场景

  • 资源管理:例如数据库连接池、线程池等,这些资源创建成本较高,使用单例模式可以确保在整个应用程序中只创建一个实例,避免资源的重复创建和浪费。
  • 全局配置:应用程序的全局配置信息,如系统参数、配置文件的读取实例等,使用单例模式可以保证在不同模块中获取到的配置信息是一致的。
  • 日志记录:日志记录器通常设计为单例,确保在整个应用程序中使用同一个日志记录实例,方便统一管理和记录日志信息。

4. 单例模式的优缺点

  • 优点
    • 节省资源:避免了频繁创建和销毁对象带来的资源开销,特别是对于创建成本较高的对象。
    • 数据一致性:由于只有一个实例,不同部分的代码对其进行操作时,数据是一致的,便于共享和管理数据。
  • 缺点
    • 全局状态:单例模式可能导致全局状态的存在,使得代码的可测试性变差。在单元测试中,可能需要特殊的处理来模拟单例的行为。
    • 并发问题:如果实现不当,在多线程环境下可能会出现线程安全问题,如创建多个实例等。

单例模式是一种简单而强大的设计模式,在适当的场景下使用可以提高程序的性能和资源管理效率,但需要注意其线程安全性和对代码可测试性的影响。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:50:14

财经资讯实时语音推送服务技术选型

财经资讯实时语音推送服务技术选型 在移动互联网与智能终端深度渗透的今天,用户获取财经信息的方式正在经历一场静默却深刻的变革。通勤路上、健身途中或驾驶时刻,越来越多的人不再依赖“看”新闻,而是选择“听”资讯。然而,当前市…

作者头像 李华
网站建设 2026/4/23 11:50:06

终极指南:如何使用Knuff快速完成APNS证书格式转换

终极指南:如何使用Knuff快速完成APNS证书格式转换 【免费下载链接】Knuff 项目地址: https://gitcode.com/gh_mirrors/knu/Knuff 你是否曾经在iOS开发中为APNS证书格式转换而头疼?每次需要将PKCS12格式转换为PEM格式时,都要打开终端&…

作者头像 李华
网站建设 2026/4/23 11:50:00

终极指南:3步绕过苹果Sidecar限制的完整方案

还在为苹果Sidecar功能仅限最新设备而烦恼吗?Free Sidecar项目通过技术手段,让那些被苹果官方"抛弃"的旧款iPad和Mac重新焕发生机。本文将深度解析这款开源工具如何修改苹果的限制机制,为你提供一套完整的跨屏显示解决方案。 【免费…

作者头像 李华
网站建设 2026/4/23 11:47:08

5大策略实现对话系统3倍推理加速:历史对话计算复用技术详解

5大策略实现对话系统3倍推理加速:历史对话计算复用技术详解 【免费下载链接】DeepSeek-V3 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-V3 在智能对话应用中,用户经常需要与AI进行多轮交互,而传统方法每次都需要重新…

作者头像 李华
网站建设 2026/4/23 14:43:00

惯性导航与磁罗盘校准:从原理到代码实现

最近在做一个无人机项目,被磁罗盘校准折腾了好几天。趁着周末把这块知识整理一下,顺便记录下踩过的坑。 前言 做过飞控或者机器人导航的朋友应该都知道,惯性导航系统(INS)是整个姿态估计的核心。但单靠IMU做航向估计会有累积误差,这时候就需要磁罗盘来提供绝对航向参考。…

作者头像 李华
网站建设 2026/4/23 6:18:26

Visio绘图效率终极提升指南:史上最全形状库使用教程

还在为Visio内置形状不够用而烦恼吗?每次绘制专业图表都要花费大量时间寻找合适的图形?作为Visio用户,你一定遇到过这些痛点。今天,我将为你介绍一个能够彻底改变你绘图体验的终极解决方案——史上最全Visio形状库。 【免费下载链…

作者头像 李华