模式动机
- 保证一个类只有一个实例且这个实例易于被访问。
- 让类自身负责保存它的唯一实例,这个类可以保证没有其他实例被创建,并且它提供一个访问该实例的方法。
模式定义
- 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,它提供全局访问的方法。
- 单例模式的三个要点:
- 某个类只能有一个实例
- 必须自行创建这个实例
- 必须自行向整个系统提供这个实例
- 单例模式是一种对象创建型模式。
单例模式结构图
单例模式分类
- 饿汉式单例类:无须考虑多个线程同时访问的问题,调用速度和反应时间优于懒汉式单例,但资源利用效率不及懒汉式单例,系统加载时间可能比较长。
- 懒汉式单例类:实现了延迟加载,但必须处理好多个线程同时访问的问题,需要通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响。
饿汉式单例类结构图
饿汉式单例类
1 | public class EagerSingleton{ |
懒汉式单例类结构图
懒汉式单例类-双重检查锁定
1 | public class LazySingleton{ |
懒汉式单例类-IoDH,静态内部类
1 | public class LazySingleton{ |
- 单例模式优点
- 提供了
对唯一实例的受控访问
- 可以
节约系统资源
,提高系统的性能 - 允许可变数目的实例(
多例类
)
- 提供了
- 单例模式缺点
- 扩展困难(
缺少抽象层
) 职责过重
- 由于自动垃圾回收机制,
可能会导致共享的单例对象的状态丢失
- 扩展困难(
- 适用情况
- 系统
只需要一个实例对象
,或因资源消耗太大而只允许创建一个对象
- 客户调用类的单个实例
只允许适用一个公共访问点
,除了该公共访问点,不能通过其他途径访问该实例
- 系统