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

23种设计模式之单例模式

目录

什么是单例模式

单例模式的优点 

创建单例模式的三大要点 

单例模式的实现方式

饿汉模式 

懒汉模式

使用场景


什么是单例模式

单例模式是一种创建型设计模式,它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。

什么是只有一个实例?

就是在整个应用程序中,只存在该类的一个实例对象,而不是创建多个相同类型的对象。

单例模式的优点 

  1. 全局控制:保证只有一个实例,这样就可以严格的控制用户怎样访问它何时访问它;
  2. 节省资源:只有一个实例存在,避免多次创建相同的对象,从而节省了系统资源;
  3. 提高性能:单例模式可以实现懒加载,只有在需要的时候才进行实例化。

创建单例模式的三大要点 

  1. 私有的构造函数:防止外部代码直接创建类的实例
  2. 私有的静态变量:保证该类的唯一实例
  3. 公有的静态方法:通过这个公有的静态方法来获取实例(全局访问点)

单例模式的实现方式

饿汉式:在类加载时就已经完成了实例的创建,不管后面创建的实例有没有使用,先创建再说。

懒汉式: 只有在请求实例时才会创建,如果首次请求时还没创建,就创建一个新的实例,如果已经创建了就返回已有的实例。

优缺点比较:

  • 饿汉模式在刚开始就创建了实例,不存在线程安全问题,但是有可能创建的实例一直没用,会造成资源浪费;
  • 懒汉模式只有在请求的时候才会创建不存在资源浪费,但是如果有多个线程同时访问getInstance()并且同一时刻检测到没有创建实例,就可能会同时创建实例,违背了单例模式,可以用互斥锁来解决。

饿汉模式 

//饿汉模式:在类加载的时候就创建实例,可能会没有使用而造成资源浪费
public class Singleton_e {
//    私有的静态实例变量private static final Singleton_e instance=new Singleton_e();private Singleton_e(){
//        私有的构造方法}
//    公有的静态访问方法public static Singleton_e getInstance(){return instance;}
}

懒汉模式

public class Singleton_l {
//     懒汉模式:在请求实例的时候才会创建
//    私有的静态变量private static Singleton_l instance;
//    私有的构造方法private Singleton_l(){}
//    公有的静态方法
//    使用双重校验锁来确保线程安全public static Singleton_l getInstance(){if(instance==null){synchronized (Singleton_l.class){if(instance==null){return new Singleton_l();}}}return instance;}
}

使用场景

1. 资源共享
多个模块共享某个资源的时候,可以使⽤单例模式,⽐如说应⽤程序需要⼀个全局的配置管理器来存储和管理配置信息。
2. 只有⼀个实例
当系统中某个类只需要⼀个实例来协调⾏为的时候,可以考虑使⽤单例模式, ⽐如说管理应⽤程序中的缓存,确保只有⼀个缓存实例,避免重复的缓存创建和管理。
3. 懒加载
如果对象创建本身就⽐较消耗资源,⽽且可能在整个程序中都不⼀定会使⽤,可以使⽤单例模式实现懒加载。
http://www.lryc.cn/news/296469.html

相关文章:

  • leetCode 30天
  • vue3+vite+ts 配置commit强制码提交规范配置 commitlint
  • PlateUML绘制UML图教程
  • 自然语言处理(NLP)——使用Rasa创建聊天机器人
  • 使用虚拟主机部署多站点
  • Openresty+Lua+Redis实现高性能缓存
  • 基于Vue2用keydown、keyup事件实现长按键盘任意键(或组合键)3秒触发自定义事件(以F1键为例)
  • 【C#】.net core 6.0 设置根目录下某个文件夹可访问,访问创建的图片等资源
  • 报错ValueError: Unknown CUDA arch (8.6) or GPU not supported
  • Golang 并发 Cond条件变量
  • linux 下 chrome 无法在设置里面配置代理的解决方法
  • C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析
  • nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法
  • Nginx方向代理和负载均衡配置
  • 贪心算法篇
  • springboot/ssm大学生就业服务平台就业招聘宣传管理系统Java系统
  • 上下固定中间自适应布局
  • 3分钟部署完成Docker Registry及可视化管理工具Docker-UI
  • 【npm】修改npm全局安装包的位置路径
  • 数据库切片大对决:ShardingSphere与Mycat技术解析
  • macbook电脑如何永久删除app软件?
  • 安卓——计算器应用(Java)
  • 【笔记】Helm-5 Chart模板指南-8 命名模板
  • Github 2024-02-08 开源项目日报 Top9
  • c语言贪食蛇游戏
  • 国际物流数字化运输方式选择指南 | 箱讯科技
  • FPS游戏框架漫谈第二十天
  • ChatGPT高效提问—prompt常见用法(续篇四)
  • 【蓝桥杯单片机记录】IO基础与LED控制
  • java 回答问题