单例模式的六种方式以及优缺点

单例

单例属于创建型模式,是一个单一的类,负责创建自己的对象,同时确保了只有单个对象被创建,提供了一种访问其唯一对象的方法,直接访问,不需要实例化该类对象

意图:是保证一个类只有一个实例,并提供一个可以访问它的全局访问点 什么时候用到:当你想控制实例数目的时候,节省系统资源的时候

主要用来解决:一个全局使用的对象频繁建立,销毁

如何解决:判断是否创建了这个单例,没有则创建,有则返回

实现方式:
实现思想:首先,不能让其他new它,也就是实例化它,所以可以用private来限制它,然后给他一个唯一返回对象的方法,也就是自己创建一个实例,让其他调它的只能选择取访问它的方法,实现实例化。

简单实现:

单例模式的六种方式以及优缺点

懒汉式:不支持多线程,线程不安全,严格意义上不算是单例。它再程序启动或单件模式类被加载时,实例就被创建

单例模式的六种方式以及优缺点

加锁懒汉式:线程安全

单例模式的六种方式以及优缺点

饿汉式:线程安全,所以支持多线程,当程序第一次访问被创建,但是效率低,因为会创建很多垃圾对象,不需要的也创建

单例模式的六种方式以及优缺点

双检锁,双重效验锁DCL:线程安全,双锁机制,在多线程情况下保持高性能,可在实例域需要延迟使用

单例模式的六种方式以及优缺点

登记式/静态内部类:能达到双检锁方式一样的功效,实现更简单,对静态域使用延迟初始化时可以这种,但只适用静态域的情况

单例模式的六种方式以及优缺点

枚举:没有广泛采用,但是是实现单例模式的最佳方法,简洁,自动支持序列化机制,绝对防止多次实例化,避免了多线程同步问题。

单例模式的六种方式以及优缺点

注意:一般情况下,不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用第 5 种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。如果有其他特殊的需求,可以考虑使用第 4 种双检锁方式。

很久之前写的,如有问题还请告知!