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

Java——单例设计模式

什么是设计模式?

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱、“套路”。

经典的设计模式共有23种。每个设计模式均是特定环境下特定问题的处理方法。
在这里插入图片描述

什么是单例设计模式?

就像它的名字一样,只能存在一个对象实例,所以叫单例模式。
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

实现思路

如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的

饿汉式

class Singleton {// 1.私有化构造器private Singleton() {}// 2.内部提供一个当前类的实例// 4.此实例也必须静态化private static Singleton single = new Singleton();// 3.提供公共的静态的方法,返回当前类的对象public static Singleton getInstance() {return single;}
}

懒汉式

class Singleton {// 1.私有化构造器private Singleton() {}// 2.内部提供一个当前类的实例// 4.此实例也必须静态化private static Singleton single;// 3.提供公共的静态的方法,返回当前类的对象public static Singleton getInstance() {if(single == null) {single = new Singleton();}return single;}
}

两种方式的对比

饿汉式:

  • 特点:立即加载,即在使用类的时候已经将对象创建完毕。
  • 优点:实现起来简单;没有多线程安全问题。
  • 缺点:当类被加载的时候,会初始化static的实例,静态变量被创建并分配内存空间,从这以后,这个static的实例便一直占着这块内存,直到类被卸载时,静态变量被摧毁,并释放所占有的内存。因此在某些特定条件下会耗费内存

懒汉式:

  • 特点:延迟加载,即在调用静态方法时实例才被创建。
  • 优点:实现起来比较简单;当类被加载的时候,static的实例未被创建并分配内存空间,当静态方法第一次被调用时,初始化实例变量,并分配内存,因此在某些特定条件下会节约内存
  • 缺点:在多线程环境中,这种实现方法是完全错误的,线程不安全,根本不能保证单例的唯一性。
http://www.lryc.cn/news/141520.html

相关文章:

  • Java实现excel表数据的批量存储(结合easyexcel插件)
  • Config:客户端连接服务器访问远程
  • 【KMP算法-代码随想录】
  • 【手写promise——基本功能、链式调用、promise.all、promise.race】
  • 计算机网络-笔记-第二章-物理层
  • 前端开发中的单伪标签清除和双伪标签清除
  • 云计算中的数据安全与隐私保护策略
  • MacOS软件安装包分享(附安装教程)
  • 【linux进程概念】
  • 直击成都国际车展:远航汽车多款车型登陆车展,打造完美驾乘体验
  • android nv21 转 yuv420sp
  • 使用Nacos与Spring Boot实现配置管理
  • 初识【类和对象】
  • 软考高级系统架构设计师系列论文八十六:论企业应用集成
  • HarmonyOS ArkUI 属性动画入门详解
  • 基于XGBoots预测A股大盘《上证指数》(代码+数据+一键可运行)
  • 5G NR:PRACH频域资源
  • 设计模式——组合模式
  • get属性是什么?有什么用?在什么场景用?get会被Json序列化?
  • 这可能是你看过最详细的 [八大排序算法]
  • docker的安装
  • 【业务功能篇75】微服务项目环境搭建docker-mysql-redisSpringCloudAlibaba
  • 学习笔记|认识数码管|控制原理|数码管实现0-9的显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第九集:数码管静态显示
  • CentOS 7/8 firewall 转发端口
  • mysql自动备份脚本
  • VUE笔记(九)vuex
  • Webpack高频面试题
  • 数字基带传输系统
  • FPGA使用MIG调用SODIMM内存条接口教程,提供vivado工程源码和技术支持
  • 深度学习数据预处理