定义

单例模式(Singleton Pattern)的定义如下:Ensure a class only has one instance, and provide a global point of access to it(确保某一个类只有一个实例,并且提供一个全局访问点来访问此实例)。在JVM应用中,单例模式表现为一个类在JVM中只有一个实例。一个相对合理的类图如下:

使用场景

  • 1、系统中需要一个共享的访问点或者共享数据,例如Web请求计数器。
  • 2、创建一个对象需要消耗的资源过多,例如IO、数据库资管等。
  • 3、需要定义大量的静态常量或者静态方法(例如工具类),可以考虑采用单例模式。

在JDK中典型的真实例子如下:
- java.lang.Runtime#getRuntime()
- java.awt.Desktop#getDesktop()
- java.lang.System#getSecurityManager()

适用性

单例模式的优势
- 采用单例模式的类能确保在一个应用中只有一个实例,减少了内存消耗以及创建或者销毁类实例时候的性能损耗。
- 可以避免对资源的多重占用。
- 可以设置应用的全局访问点,优化和共享资源访问。

单例模式的劣势
- 单例模式一般没有接口或者基类,扩展困难,扩展必须修改类代码。
- 紧密耦合的代码,对测试不利,简单来说就是不能Mock掉。
- 单例模式违反单一责任原则,因为它既要保持”单例”又要顾及业务逻辑。

实现方式

懒汉方式

懒汉方式的关键字在于”懒”,也就是懒加载(Lazy Load),一个很常见的使用方式就是双重检查锁定(Double-Check Locking):

public class Singleton {private static volatile Singleton INSTANCE = null;private Singleton(){}public static Singleton getInstance(){if (null == INSTANCE){synchronized (Singleton.class){if (null == INSTANCE){INSTANCE = new Singleton();}}}return INSTANCE;}
}

饿汉方式

饿汉方式的实现相对简单:

public class Singleton {private static volatile Singleton INSTANCE = new Singleton();private Singleton(){}public static Singleton getInstance(){return INSTANCE;}
}

静态内部类方式

使用静态内部类方式的好处是既可以实现延迟加载,又可以保证线程安全,它的实现如下:

public class Singleton {private Singleton(){}private static class InterClassHolder{private final static Singleton INSTANCE = new Singleton();}public static Singleton getInstance(){return InterClassHolder.INSTANCE;}
}

最佳实践-单元素枚举方式

《Effective Java》第2版中指出:单元素枚举类型是实现单例的最佳方式。这是因为,前面说到的三种实现方式都可以通过反射改变类的行为,但是枚举类型可以避免这个问题。建议在所有需要使用到单例模式的情况下直接使用单元素枚举方式实现单例:

public enum Singleton {INSTANCE;public void sayHello() {}
}

使用方式:Singleton.INSTANCE.sayHallo()

故事

Doge是公司里一个核心项目的开发组长,手下有十多个组员分别负责开发项目的不同模块。

Doge展示了一个日期工具类和它的使用情况:

public class DateUtils {public static String format(LocalDateTime target,String pattern){return DateTimeFormatter.ofPattern(pattern).format(target);}public LocalDateTime parse(String target,String pattern){return LocalDateTime.parse(target, DateTimeFormatter.ofPattern(pattern));}
}//调用情况
DateUtils.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
LocalDateTime target = new DateUtils().parse("2018-7-29 12:12:30","yyyy-MM-dd HH:mm:ss");

小黑贴了一下重写的工具类:

public enum DateUtils {SINGLETON;private static final Map<String, DateTimeFormatter> FORMATTER_CACHE = new HashMap<>();public String format(LocalDateTime target, String pattern) {return getOrCreateFormatter(pattern).format(target);}public LocalDateTime parse(String target, String pattern) {return LocalDateTime.parse(target, getOrCreateFormatter(pattern));}private DateTimeFormatter getOrCreateFormatter(String pattern) {DateTimeFormatter formatter;if (FORMATTER_CACHE.containsKey(pattern)) {formatter = FORMATTER_CACHE.get(pattern);} else {formatter = DateTimeFormatter.ofPattern(pattern);FORMATTER_CACHE.put(pattern, formatter);}return formatter;}
}//调用
DateUtils.SINGLETON.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss");
LocalDateTime target = DateUtils.SINGLETON.parse("2018-7-29 12:12:30", "yyyy-MM-dd HH:mm:ss");

Doge拷贝了小黑的工具类代码,并且仿照这个类的逻辑完成了其他工具类的代码重构。

(本文完)

GOF设计模式之单例模式相关推荐

  1. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

  2. 设计模式之单例模式(Singleton)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  3. (转):GOF设计模式趣解(23种设计模式)

    GOF设计模式趣解(23种设计模式) 创建型模式 1.FACTORY--追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务 ...

  4. java 23种设计模式 04 单例模式

    java 23种设计模式 04 单例模式 一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象.   ...

  5. 总结:GoF设计模式及应用

    2019独角兽企业重金招聘Python工程师标准>>> GoF设计模式 Christopher Alexander 说过:"每一个模式描述了一个在我们周围不断重复发生的问题 ...

  6. GOF设计模式快速学习

    这段时间,学习状态比较一般,空闲时基本都在打游戏,和研究如何打好游戏,终于通过戏命师烬制霸LOL,玩笑了.为了和"学习"之间的友谊小船不翻,决定对以往学习过的GOF设计模式做一个简 ...

  7. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  8. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  9. sql中如何统计各种零件的总数量_如何应用GOF设计模式中的构建者模式创建复合对象实例...

    软件项目实训及课程设计指导--如何应用GOF设计模式中的构建者模式创建复合对象实例 1.GOF设计模式中的构建者模式 构建者设计模式能够将一个复杂对象(它一般为组合类)的构建过程与它的表示部件相互分离 ...

最新文章

  1. novaclient的api调用流程与开发
  2. 2021年春季学期-信号与系统-第十三次作业参考答案-第八小题
  3. soapui工具_基于开源的API测试工具!不再为web服务负载测试而发愁
  4. linux将所有文件生成lst_10行Python代码自动清理电脑内重复文件,解放双手!
  5. BOM模型中常用对象 定义计数器 网页跳转 网页前进后退
  6. 一位19年的Mac用户:“我真的很讨厌库克”
  7. 调参心得:超参数优化之旅
  8. 阶段3 1.Mybatis_09.Mybatis的多表操作_4 完成account一对一操作-建立实体类关系的方式...
  9. html5文字游戏引擎,【HTML5 Game】一步步开发一个 TypeShot 的打字游戏
  10. onvif协议讲解(一)
  11. retinaface人脸检测在fddb数据集上的测试
  12. [Codeforces266E]More Queries to Array...——线段树
  13. 微信公众号的简单常识
  14. 看完这个教程,不怕Xshell中修改字体有困难
  15. 生产管理系统定制开发的项目流程
  16. VMW配置FusionStorage Manager(FSM)虚拟机主备
  17. “一见钟情” 文证通证件识别让旅行证件不再寂寞
  18. 【历史上的今天】9 月 6 日:Facebook 收购 Instagram;华为发布 5G 芯片;惠普并购康柏
  19. 基于随机无迹σ变异的改进HHO算法
  20. linux删除的快捷键

热门文章

  1. Head FIrst OOAD 读书笔记
  2. 解决rdm连接虚拟机redis失败,idea无法连接
  3. Linux 启动jar项目相关命令(解决关闭Linux终端,程序自动停止问题)
  4. 机器学习 第二节 第二课
  5. EXCEL 也可以使用chatGPT了,教程来了
  6. CHIL-SQL-NULL 函数
  7. 高斯消元法小总结和瞎总结
  8. 知多少:数据分析师和数据科学家的区别
  9. 计算机网络原理fin,一个动画看懂网络原理之TCP建立和释放过程
  10. 计算机领域的几个翻译问题