设计模式单例

单例模式

设计原则:无
常用场景:应用中有对象需要是全局的且唯一
使用概率:99.99999%
复杂度:低
变化点:无
选择关键点:一个对象在应用中出现多个实例是否会引起逻辑上或者是程序上的错误
逆鳞:在以为是单例的情况下,却产生了多个实例
相关设计模式
原型模式:单例模式是只有一个实例,原型模式每拷贝一次都会创造一个新的实例。



常用场景:
1.需要频繁实例化然后销毁的对象。
2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
3.有状态的工具类对象。
4.频繁访问数据库或文件的对象。
以下都是单例模式的经典使用场景:
1.资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
2.控制资源的情况下,方便资源之间的互相通信。如线程池等。


优点:
1.在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例
2.单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
3.提供了对唯一实例的受控访问。
4.由于在系统内存中只存在一个对象,因此可以 节约系统资源,当 需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
5.允许可变数目的实例。
6.避免对共享资源的多重占用。
缺点:
1.不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
2.由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
3.单例类的职责过重,在一定程度上违背了“单一职责原则”。
4.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。



基本思想
1.在类中实例化一个私有对象
2.构造方法私有化
3.提供一个静态方法返回实例化的对象


现有的一些单例模式区别主要在
1.类加载时 直接进行对象初始化 增大项目启动时系统开销
类加载时不初始化 在方法中判断空 进行初始化
2.并发
直接初始化 不存在并发、产生多对象、非单例问题
使用时初始化 要考虑 初始化方式 防止并发可能产生 多实例问题


在实际使用场景中,不推荐使用直接初始化的方式。


public class Singleton {private Singleton() {}/*//最基本方式  但是会引起并发创建多实例问题  一定不能用private static Singleton singleton;public static Singleton getInstance() {if (singleton==null) {singleton = new Singleton();}return singleton;}*//*//直接方法同步  不会存在并发多实例问题  但设计很糟糕在获取实例时会产生等待  不推荐private static Singleton singleton;public synchronized static Singleton getInstance() {if (singleton==null) {singleton = new Singleton();}return singleton;}*//*//双重加锁  使用类实例进行加锁//只是看起来好很多,在Java指令中创建对象和赋值操作是分开进行的,也就是说instance = new Singleton();// 语句是分两步执行的。但是JVM并不保证这两个操作的先后顺序,也就是说有可能JVM会为新的Singleton实例分配空间,// 然后直接赋值给instance成员,然后再去初始化这个Singleton实例。这样就可能出错了private static Singleton singleton;public static Singleton getInstance() {if (singleton==null) {synchronized (Singleton.class) {if (singleton==null) {singleton = new Singleton();}}}return singleton;}*///终极模式 使用内部类//主要依据static 只会在jvm加载类时初始化一次,即内部类中 instance 由jvm保证了只初始化一次private static class SingletonFactory {private static Singleton instance = new Singleton();}public static Singleton getInstance() {return SingletonFactory.instance;}}

 



转载于:https://www.cnblogs.com/zhaojj/p/7763015.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Squid服务日志分析

Squid服务日志分析 Apache 和 Squid 是两种著名的代理缓存软件,但Squid 较 Apache 而言是专门的代理缓存服务器软件,其代理缓存的功能强大,支持 HTTP/1.1 协议,其缓存对象也较多;并且 Squid 的缓存管理模块和访问控制模…

[转载] Java中的元数据

参考链接: Java中的数据类型 元数据 也可能刚听到元数据你会有点陌生,其实任何一个使用过struts,ejb或者hibernate的开发人员都在不知不觉中使用元数据。所谓的元数据是指用来描述数据的数据,更通俗一点就是描述代码间关系&#…

云时代 揭开性能监测战略的隐秘优势

云时代的性能监测战略 能够对各种变化做出快速响应而不偏离重心和企业发展动力,正逐渐成为各行各业、各种规模企业的奋斗目标。业务敏捷性通常是运营良好,可实现盈利的企业标志。实现这一目标意味着公司已经成功地利用业务关键型技术来提高生产率&#x…

[转载] java 枚举Enum源码解析

参考链接: 使用Java枚举 应用场景 枚举是单例模式中的一种。面试官系统之设计模式(单例模式) 简单来讲就是只能实例化一次,线程安全且性能高。枚举通常用来列举一个类型的有限实例集合,我们可以使用常量集来实现&…

聊聊全站HTTPS带来的技术挑战

日前写的文章里了讨论了数据传输的安全性的问题,最后一部分提到了通过HTTPS解决数据传输安全性的方案。那么一个新问题又来了,实施全站HTTPS的过程中,我们可能会遇到哪些技术问题?所以我今天和大家一起来算一下这个账,将技术成本…

[转载] spring mvc自定义int枚举转换器

参考链接&#xff1a; Java中具有自定义值的枚举 2019独角兽企业重金招聘Python工程师标准>>> public class MyIntegerEnumConverters { WritingConverter public static class EnumToIntegerConverter implements Converter<IntEnumConvertable, String> {…

使用BufferedImage进行渐变色操作

序 本文主要简述一下如何使用BufferedImage进行渐变色操作。 GradientPaint java/awt/GradientPaint.java public class GradientPaint implements Paint {Point2D.Float p1;Point2D.Float p2;Color color1;Color color2;boolean cyclic;//...... } 这个是生成渐变色的关…

[转载] Java中的字符串处理

参考链接&#xff1a; Java中的StringBuffer appendCodePoint()方法以及示例 JDK8在线Api中文手册 JDK8在线Api英文手册 Java中的字符串处理 1.1 String类的构造函数1.2 字符串的长度1.3 特殊的字符串操作1.3.1 字符串字面值1.3.2 字符串连接1.3.3 字符串和其他数据类型的连…

MySQL循环语句之while循环测试

转自&#xff1a;http://www.nuoweb.com/database/7614.htmlMySQL有循环语句操作&#xff0c;while 循环、loop循环和repeat循环&#xff0c;目前我只测试了 while 循环&#xff0c;下面与大家分享下mysql 操作同样有循环语句操作&#xff0c;网上说有3中标准的循环方式&#x…

[转载] JAVA环境变量配置

参考链接&#xff1a; Java中的变量 安装JDK(1.8) Oracle官网 下载jdk 百度网盘window版本 提取码&#xff1a;o99i win 10环境变量配置 在电脑桌面 右键点击 此电脑 的 属性 选项 选择 高级系统设置 > 然后点击 环境变量 选项 点击 系统变量 下的 新建 按钮&#xf…

[转载] Java中的变量和常量

参考链接&#xff1a; Java中的变量范围 在程序中存在大量的数据来代表程序的状态&#xff0c;其中有些数据在程序的运行过程中值会发生改变&#xff0c;有些数据在程序运行过程中值不能发生改变&#xff0c;这些数据在程序中分别被叫做变量和常量。 在实际的程序中&#xf…

4.3/4.4 磁盘分区

2019独角兽企业重金招聘Python工程师标准>>> 添加虚拟磁盘 第一步&#xff0c;选择虚拟机中的“设置” 第二步&#xff0c;选择“添加硬盘” 第三步&#xff0c;选择_SCSI &#xff08;推荐&#xff09; # 保持默认 第四步&#xff0c;选择“创建新的虚拟磁盘…

[转载] java(三)对象的序列化与static、final关键字

参考链接&#xff1a; Java中的final最终变量 java对象的序列化 Java序列化是指把Java对象转换为字节序列的过程&#xff1b;而Java反序列化是指把字节序列恢复为Java对象的过程。java中存有Cloneable接口&#xff0c;实现此接口的类都具有被拷贝能力&#xff0c;比new一个对象…

RoboMaster 2017:机器人版的「王者农药」,工程师们的竞技时代

8月6日晚&#xff0c;第十六届全国大学生机器人大赛 RoboMaster 2017机甲大师赛在华润深圳湾体育中心“春茧”体育馆举行&#xff0c;关于这个比赛的盛况已经无需赘述&#xff0c;去年雷锋网参加上届比赛时&#xff0c;报道的是「像看了一场演唱会」&#xff0c;如果用演唱会来…

[转载] 详解Java中的泛型

参考链接&#xff1a; Java中具有泛型的有界类型 1、什么是泛型 泛型&#xff0c;即“参数化类型”。一提到参数&#xff0c;最熟悉的就是定义方法时有形参&#xff0c;然后调用此方法时传递实参。那么参数化类型怎么理解呢&#xff1f;顾名思义&#xff0c;就是将类型由原来…

【初学者必读】:前端工程师的知识体系

下图是前端工程师图解&#xff1a; 前端开发的核心是HTML CSS JavaScript。本质上它们构成一个MVC框架&#xff0c;即HTML作为信息模型&#xff08;Model&#xff09;&#xff0c;CSS控制样式&#xff08;View&#xff09;&#xff0c;JavaScript负责调度数据和实现某种展现逻…

[转载] Java面试题大全(2020版)

参考链接&#xff1a; Java中的循环 发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~ 本套Java面试题大全&#xff0c;全的不能再全&#xff0c;哈哈~ 博主已将以下这些面试题整理成了一个…

使用Prometheus监控Cloudflare的全球网络

Matt Bostock在SRECON 2017欧洲大会的演讲中&#xff0c;介绍了如何使用Prometheus实现对CloudFlare分布于全球的架构和网络的监控。Prometheus是一种基于度量进行监控的工具&#xff0c;CloudFlare是一家CDN、DNS和DDoS防御&#xff08;Mitigation&#xff09;服务提供商。\\基…

[转载] Java-forEach增强for循环是值传递规则详解

参考链接&#xff1a; Java中的for-each循环 1. 引入 正如Java语法意义&#xff0c;变量的传递只有值传递&#xff0c;虽然变量分为引用变量和基本类型变量&#xff0c;前者更像C中的地址概念。 在学习Lambda表达式的时候&#xff0c;遇到了试图在增强for循环中对原链表元素重…

开始吧

2019独角兽企业重金招聘Python工程师标准>>> 写C三年有余&#xff0c;在技术方面也算小有所成。准备在这里分享一些C进阶、Python、Golang技术文章。 CSDN博客地址&#xff1a; http://blog.csdn.net/godmaycry 以后博客同步更新。 转载于:https://my.oschina.net/u…