当前位置: 首页 > 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【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

相关文章:

  • LabVIEW项目外协时选择公司与个人兼职的比较
  • 工业路由器与家用路由器的区别
  • 4、音视频封装格式---FLV
  • 深度学习之半监督学习:一文梳理目标检测中的半监督学习策略
  • IT专业入门,高考假期预习指南
  • 浅谈前置处理器之用户参数
  • 一文学会LVS:概念、架构、原理、搭建过程、常用命令及实战案例
  • 基于Java微信小程序小说阅读系统设计和实现(源码+LW+调试文档+讲解等)
  • 使用 Vue 实现包含单选框的弹窗功能(附Demo)
  • 苹果公司的Wifi定位服务(WPS)存在被滥用的风险
  • GPIO和PIN
  • 用户想知道数据库每天增长几个G,到底都是啥?
  • Jmeter 入门指南:从零开始学习
  • 【分享】Word“打开密码”的常见问题及解决方法
  • electron教程(一)创建项目
  • 【翻译】babel对TC39装饰器草案的实现
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • iOS 系统授权开发
  • JS实现简单的MVC模式开发小游戏
  • Spring框架之我见(三)——IOC、AOP
  • Webpack 4x 之路 ( 四 )
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 多线程 start 和 run 方法到底有什么区别?
  • 给初学者:JavaScript 中数组操作注意点
  • 力扣(LeetCode)357
  • 前端存储 - localStorage
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用权重正则化较少模型过拟合
  • 试着探索高并发下的系统架构面貌
  • 我的业余项目总结
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • (09)Hive——CTE 公共表达式
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (过滤器)Filter和(监听器)listener
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Framework杂记
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Standard 的管理策略
  • .NET 的程序集加载上下文
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET命名规范和开发约定
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [8481302]博弈论 斯坦福game theory stanford week 1