设计模式-单例模式概述 | 京东云技术团队
我们常把23种经典的设计模式分为三类:创建型、结构型、行为型,其中创建型设计模式主要解决“对象的创建”问题,将创建和使用代码解耦,结构型设计模式主要解决“类或对象的组合或组装”问题,将不同功能代码解耦,行为型设计模式主要解决“类或对象之间的交互”问题,将不同的行为代码解耦。
原理
是一种创建型模式,一个类只允许创建一个实例对象,那这个类就是个单例类。
实现
①构造函数私有化,避免外部通过new创建实例;
②考虑对象创建时的线程安全问题;
③考虑是否支持延迟加载;
④考虑getInstance()性能是否高(是否加锁)
⑤考虑序列化和反序列化是否会破坏单例
⑥考虑反射攻击单例
饿汉式
饿汉式的实现方式,在类加载期间,就已经将instance静态实例初始化好了,所以instance实例的创建是线程安全的。不过这样的实现不支持延迟加载实例。 | 懒汉式相对于饿汉式的优势是支持延迟加载。这种实现方式会导致频繁加锁、释放锁,以及并发度低等问题,频繁的调用会产生性能瓶颈。
懒汉式
懒汉式相对于饿汉式的优势是支持延迟加载。这种实现方式会导致频繁加锁、释放锁,以及并发度低等问题,频繁的调用会产生性能瓶颈。
双重检测
双重检测实现方式既支持延迟加载、又支持高并发的单例实现方式。只要instance被创建之后,再调用getInstance()函数都不会进入到加锁逻辑中。所以这种方式解决了懒汉式并发度低的问题。(解决指令重排序,可以给instance成员变量加上volatile关键字)
静态内部类
利用 Java 的静态内部类来实现单例。这种实现方式,既支持延迟加载,也支持高并发,instance的唯一性,创建过程的线程安全性,都由JVM保证。实现起来比双重检测简单。
枚举
最简单的实现方式,基于枚举类型的单例实现。这种实现方式通过Java枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。还可解决序列化和反序列化生成新的实例。
应用场景
从业务概念上,有些数据在系统中应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类,除此之外,还可以使用单例解决资源访问冲突的问题(分布式锁和并发队列亦可解决)。
存在问题
- 单例对OOP特性支持不友好;
- 单例会隐藏类之间的依赖关系;
- 单例对代码扩展性不友好;
- 单例对代码的可测试性不友好;
- 单例不支持有参数的构造函数。
替代方案
静态方法(不推荐)、工厂模式、Spring IOC容器
作者:京东零售 马宏伟
来源:京东云开发者社区 转载请注明来源

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【行云流水线实践】基于“OneBuild”方法对镜像进行快速装箱 | 京东云技术团队
在云原生领域,无论使用哪种编排调度平台,Kubernetes,DockerSwarm,OpenShift等,业务都 需要基于镜像进行交付,我们在内部实践“Source-to-image”和链式构建,总而总结出“OneBuild”模式。 其核心思想是:一处构建,多处使用。 问题 一般,我们会使用类似Jenkins CI系统来构建镜像,以满足持续集成,持续开发,持续交付等场景。事实上,如果我们在某一方面能够提升效率或者解决镜像交付实践。 长期来看,将能够带来不少的成本收益,并且对于平台来讲,这种收益是一种可度量收益。假设我们在当前交付(git)分支中,需要fix或者feature已经release分支的,如何进行?如果在已经交付给用户的镜像中存在漏洞,需要批量交付,如何进行?为了解决这些问题,我们的团队必须重新构建镜像,并且找出基本镜像,构建过程有那些依赖关系。然后基于这些成熟的流程和规范进行快速交付。 解决方案 Docker build是大家比较常用的镜像构建方法,并且在构建中只需要声明自己的Dockerfile即可,就可以实现快速构建。但是这并不满足大型企业实践以及快速交付。 所以需要...
- 下一篇
SaaS 出海,如何搭建国际化服务体系?(三)
防噎指南:这可能是你看到的干货含量最高的 SaaS 出海经验分享,请准备好水杯,放肆食用(XD。 当越来越多中国 SaaS 企业选择开启「国际化」副本,出海便俨然成为国内 SaaS 的新·角斗场。 LigaAI 观察到,出海浪潮助生了许多「Day One 就做国际化」的产品和团队,而出海大军中也不乏在国内已经完成 PMF 的熟悉面孔。一个主要由中国人构成的团队在推进海外产品落地的过程中,可能会遇到哪些困难?是否能以行之有效的「避雷方案」,加快行军速度,一路披荆斩棘? 为解答心中的疑惑, #Liga妙谈# 第九期特别邀请 Aftership 全球客户成功副总裁刘徽(Sean)一起探讨中国 SaaS 企业出海的「路与行」,并为大家献上可复制、可实践、可落地的出海实操技巧。 全系列内容共分为三篇,本篇为第三篇:关于跨时区的异步团队协作模式的探讨。 中国 SaaS 企业出海会遇到哪些常见难题? 哪些 SaaS 产品或团队更适合发展出海业务? 大/中/小型企业如何落地国际化服务体系? 异步团队如何开展更高效的跨时区协作? 04 高效的跨时区管理与协作 LigaAI:SaaS 企业出海会遇到哪些跨...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块