关于单例模式,可能是23种模式里面最容易理解的一种模式了,这篇文章里主要是整理了一下从网上搜集的材料,文字部分大部分直接从网上拷贝而来。中间有部分自己的理解。
单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
单例模式适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统,它们都是原型的例子。典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问指针,这便是众所周知的单例模式的应用。当然这只有在你确信你不再需要任何多于一个的实例的情况下。
尽管单例设计模式如在下面的图中的所显示的一样是最简单的设计模式,但对于粗心的Java开发者来说却呈现出许多缺陷。
在《设计模式》一书中,作者这样来叙述单例模式的:确保一个类只有一个实例并提供一个对它的全局访问指针。
下图说明了单例模式的类图。
单例模式的类图
正如你在上图中所看到的,这不是单例模式的完整部分。此图中单例类保持了一个对唯一的单例实例的静态引用,并且会从静态getInstance()方法中返回对那个实例的引用。
很多人都会写的一种单例类型:
但是这种单例类型在多线程中是不安全。有可能会出现两个INSTANCE.为什么呢?
如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。
懒汉式单例模式:
还有另外一个方法(也被称为饿汉式单例模式):
这样写就会避免出现两个INSTANCE了。比较:
- 饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。
- 懒汉式适合单线程,多线程情况下如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
-
从实现方式来讲他们最大的区别就是懒汉式是延时加载,
他是在需要的时候才创建对象,而饿汉式在加载类时创建实例。
饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例(上面有个朋友写错了)、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。 懒汉式的优点是延时加载、缺点是应该用同步。
分享到:
相关推荐
2024-2030全球及中国PCB接触式探头行业研究及十五五规划分析报告
网站界面设计mortal0418代码
PHP毕业设计-校园失物招领系统源码+数据库.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可作为课程设计、期末大作业。包含全部项目源码、该项目可以直接作为毕设使用。项目都经过严格调试,确保可以运行! PHP毕业设计-校园失物招领系统源码+数据库.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可作为课程设计、期末大作业。包含全部项目源码、该项目可以直接作为毕设使用。项目都经过严格调试,确保可以运行! PHP毕业设计-校园失物招领系统源码+数据库.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可作为课程设计、期末大作业。包含全部项目源码、该项目可以直接作为毕设使用。项目都经过严格调试,确保可以运行! PHP毕业设计-校园失物招领系统源码+数据库.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可
2024年神经酸行业分析报告.pptx
【Java爬虫】信息抓取的实现 完整实例(源码)
rain-drop.PNG
FEDformer.pdf
基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资
完整代码!扫雷游戏,vs2010使用vs2010开发小游戏,这是一个扫雷的游戏,适应于大作业和毕业论文.zip
JDK 8 0 apidoc 带完整索引和目录
可以进行模拟银行服务,有多种功能。
校园共享单车管理系统 软件工程做的课程设计,里面是JSP源码,后台连接数据库,可直接调试运行成功。
去水印版,aspose.words-19.7-jdk17.jar、aspose-words-19.7.pom
NKUcs22级机器学习实验全套代码于此,希望造福学弟学妹。
springboot校园医疗保险管理系统
QPSK的锁相环程序,在MATLAB环境下编写的,用来进行QPSK通信系统的仿真和实际信号载波同步的提取
stm32项目知识领域: 网络安全 技术关键词: 漏洞分析、渗透测试、加密算法 内容关键词: 攻击防范、身份验证、网络流量分析 用途: 学习保护信息系统免受恶意攻击和数据泄露 资源描述: "OWASP官方网站"提供了全面的网络安全知识和工具,包括常见漏洞、安全指南和最佳实践。
springboot时间管理系统 系统实现了首页,个人中心,系统公告管理,用户管理,时间分类管理,事件数据管理,目标数据管理,用户日记管理等功能。 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog
SNR,SNDR,THD,ENOB,SFDR的matlab计算程序 matla
springboot商品推荐系统 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog