定义

单例模式(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. io_service work 的作用
  2. 【洛谷P1378】油滴扩展
  3. 线程的生命周期及五种基本状态介绍
  4. 关于js函数未定义not defined引发的感想
  5. trie树的数据结构_C / C ++中的Trie数据结构
  6. C# Wke使用例子 (KyozyWke)
  7. 各协议的协议号和端口号
  8. 周育如的音标口诀大全_音标记忆顺口溜(48个),快速记忆音标口诀!
  9. unity3d Realistic eye shading 真实的眼睛渲染
  10. ajax/ 回调函数(回调地狱)
  11. 【NLP】Transformer框架原理详解-1
  12. MATLAB编辑AWG波形,AWG5200任意波形发生器的功能特点及性能分析
  13. 如何编制试算平衡表_试算平衡表的编制步骤是怎样的?
  14. win101909要不要更新_近年最稳的Win10更新?Win101909值得升级吗
  15. doodoo.js快速入门教程 1
  16. 亨利福特真的说过“faster horse”么?
  17. msf之进阶免杀技术,无视360
  18. 232转can转换器 最新工艺
  19. 美术0基础想转行做游戏美术3D,如何快速入行?
  20. android中 menu的属性详细解释

热门文章

  1. web前端目前的就业形势_2020年Web前端的前景及就业形势
  2. Fractal解题笔记
  3. 延时任务的四种实现方式
  4. 《Educated》《你当像鸟飞往你的山》阅读笔记
  5. 传感器故障下的滑模观测器的设计方法——Utkin观测器和Walcott-Zak 观测器
  6. 台湾地震 涉及大陆光缆
  7. 本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
  8. UOS和Deepin的前世今生
  9. 广播风暴的产生原因和原理是什么?
  10. 海康威视浅淡智能视频分析技术及产品的应用 智能视频分析技术的应用与发展