第9章 单例模式
单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
1.模式动机
Windows任务管理器,确保唯一性,没有其他实例被创建,并且提供访问该实例的方法。
2.要点
- 必须自行创建这个实例->单例类的构造函数为私有
- 这个类只能有一个实例->提供一个自身的静态私有成员变量
- 必须自行向系统提供这个实例->提供一个公有的静态工厂方法
- 饿汉式、懒汉式
饿汉式 | 先new了再说 | EagerSingleton = new EagerSingleton() |
懒汉式 | 不调用getInstance()就不new | LazySingleton = null |
- 多线程、分布式:延时加载、二次锁定(synchronized)、静态内部类(IoDH)
3.一个角色
单例角色( Singleton):
- 在内部实现只生成一个实例,提供一个静态的getInstance()工厂方法
- 为了防止在外部对其实例化,将其构造函数设计为私有
- 在单例类内部定义一个 Singleton类型的静态对象,作为外部共享的唯一实例
4.适用环境
- 系列只需要一个实例对象
- 客户调用类的单个实例只允许使用一个公共访问点
5.注意问题
- 不使用单例模式存取全局变量
- 不要将数据库连接做成单例
6.优点
- 提供了对唯一实例的受控访问
- 节约资源,提高性能
- 允许可变数目的实例
7.缺点
- 拓展困难
- 违背“单一职责原则”
- 滥用单例会出现负面问题