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

23种设计模式【创建型模式】详细介绍之【单例模式】

23种设计模式【创建型模式】详细介绍之【单例模式】

  • 设计模式的分类和应用场景总结
  • 单例模式
    • 1. 概述
    • 2. 实现方式
      • 2.1 饿汉式单例模式
      • 2.2 懒汉式单例模式(非线程安全)
      • 2.3 懒汉式单例模式(线程安全)
    • 3. 单例模式的优缺点
      • 3.1 优点
      • 3.2 缺点
    • 4. 使用场景
    • 5. 注意事项
    • 6. 总结

设计模式的分类和应用场景总结

可以查看专栏设计模式:设计模式

单例模式

在软件设计模式中,单例模式是一种常见且重要的创建型模式。它确保一个类只有一个实例,并提供一个全局访问点。

1. 概述

单例模式属于创建型设计模式,用于限制类的实例化次数为一个。它通常在需要管理全局状态或控制共享资源访问时发挥作用,例如配置信息、日志记录器、数据库连接池等。单例模式能够有效地节省系统资源,提高性能,并且易于扩展和维护。

2. 实现方式

单例模式的实现方式通常包括以下几种:

2.1 饿汉式单例模式

在类加载时即创建实例,保证线程安全,但可能会导致资源浪费。

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}

2.2 懒汉式单例模式(非线程安全)

延迟实例化,在第一次使用时创建实例,简单但非线程安全。

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

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

3. 单例模式的优缺点

3.1 优点

  • 全局唯一实例: 确保一个类只有一个实例存在,避免了不必要的内存占用。
  • 延迟初始化: 在需要时才进行实例化,节省系统资源。
  • 线程安全(部分实现): 可以通过同步机制确保在多线程环境下的安全访问。

3.2 缺点

  • 可能引起资源浪费: 饿汉式单例在类加载时即创建实例,可能导致不必要的资源占用。
  • 复杂度增加: 实现线程安全的懒汉式单例需要考虑双重检查锁定等机制,增加了复杂性。

4. 使用场景

单例模式适合以下场景:

  • 资源共享情况: 需要共享访问的资源,如线程池、缓存、对话框等。
  • 控制资源的使用: 资源池管理、日志对象等。

5. 注意事项

在使用单例模式时,需要注意以下几点:

  • 线程安全性: 根据具体需求选择合适的实现方式,确保在多线程环境下的安全访问。
  • 反射攻击: 可以通过私有构造方法抛出异常或在创建第二个实例时抛出异常来防止反射攻击。
  • 序列化与反序列化: 如果单例类可能会被序列化和反序列化,需要实现 readResolve() 方法来避免创建新的实例。

6. 总结

单例模式是一种简单而强大的设计模式,能够有效地管理全局状态和资源,提高系统的性能和可维护性。在实际应用中,根据具体需求选择合适的实现方式,并注意线程安全和资源管理问题。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

http://www.lryc.cn/news/389835.html

相关文章:

  • 某汽车配件制造公司任职资格体系项目成功案例纪实
  • 【Linux】生物信息学常用基本命令
  • React Native V0.74 — 稳定版已发布
  • Python面试宝典第4题:环形链表
  • Kubernetes (K8s) 底层原理
  • 解析Kotlin中的委托(包括类委托,属性委托)【笔记摘要】
  • vue3+ts+uniapp+vite+pinia项目配置
  • 大数据开发语言 Scala(四):面向对象编程
  • C++ //练习 14.31 我们的StrBlobPtr类没有定义拷贝构造函数、赋值运算符及析构函数,为什么?
  • 通配符和正则表达式之间的关系
  • GY-30光照传感器软件I2C方式驱动代码,基于STM32Cube
  • 双相元编程:一种新语言设计方法
  • 基于SpringBoot校园外卖配送系统设计和实现(源码+LW+调试文档+讲解等)
  • 茗鹤APS高级计划排程系统,在集团多工厂协同生产下的应用
  • 分享六款免费u盘数据恢复工具,U盘恢复工具集合【工具篇】
  • Linux 的启动流程
  • 思维导图插件--jsMind的使用
  • mac上使用finder时候,显示隐藏的文件或者文件夹
  • 泰雷茲具有首个通过FIPS 140-3 三级认证的HSMs
  • 美术馆预约小程序的设计
  • 序列化Serializable
  • 编写静态库
  • hive的表操作
  • 基于多视点编码光场的全景三维重建方法
  • Spring Boot中的分布式文件系统
  • three.js地理坐标系有哪些,和屏幕坐标系的转换。
  • 聊聊C++20的三向比较运算符 `<=>`
  • CVE-2024-0603 漏洞复现
  • 西部智慧健身小程序+华为运动健康服务
  • Spring Boot中如何处理异步任务