单例模式 Singleton
动机
- 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
- 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
- 这应该是类设计者的责任,而不是使用者的责任。
百度百科定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Java中单例定义
一个类有且仅有一个实例,并且自行实例化向整个系统提供。
单例解决了什么问题?
Java的单例模式主要解决了多线程并发访问共享资源的线程安全问题。
单例应用场景
1. 共享资源的访问与操作场景,如Windows系统的资源管理器,Windows系统的回收站,显卡的驱动程序,系统的配置文件,工厂本身(类模板),应用程序的日志对象等。
2. 控制资源访问与操作的场景,如数据库的连接池,Java的线程池等。
单例命名
单例的命名通常包含 singleton(以 singleton 开头或结尾) 或能按名称实际意义区分出在应用中唯一。
单例通用设计规则
1. 私有化类构造器。
2. 定义静态私有的类对象。
3. 提供公共静态的获取该私有类对象的方法。
要点总结
- Singleton 模式中的实例构造器可以设置为 protected 以允许子类派生。
- Singleton 模式一般不要支持拷贝构造函数和 Clone 接口,因为这有可能导致多个对象实例,与 Singleton 模式的初衷违背。
- 如何实现多线程环境下安全的 Singleton?注意对双检查锁的正确实现。
代码实现
- 饿汉式,详见 饿汉式,测试类 饿汉式-测试
-
懒汉式,写法大致有如下四种:
-
注册登记式,写法大致有如下两种:
- Map容器注册登记式,详见 Map容器注册登记式,测试类 Map容器注册登记式-测试
- 枚举注册登记式,详见 枚举注册登记式,测试类 枚举注册登记式-测试
- 序列化式,详见 序列化式,测试类 序列化式-测试
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。