单例模式 Singleton

2次阅读

共计 876 个字符,预计需要花费 3 分钟才能阅读完成。

单例模式 Singleton
动机

在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
这应该是类设计者的责任,而不是使用者的责任。

百度百科定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Java 中单例定义
一个类有且仅有一个实例,并且自行实例化向整个系统提供。

单例解决了什么问题?
Java 的单例模式主要解决了多线程并发访问共享资源的线程安全问题。

单例应用场景
1. 共享资源的访问与操作场景,如 Windows 系统的资源管理器,Windows 系统的回收站, 显卡的驱动程序,系统的配置文件,工厂本身(类模板),应用程序的日志对象等。
2. 控制资源访问与操作的场景,如数据库的连接池,Java 的线程池等。

单例命名
单例的命名通常包含 singleton(以 singleton 开头或结尾) 或能按名称实际意义区分出在应用中唯一。

单例通用设计规则
1. 私有化类构造器。
2. 定义静态私有的类对象。
3. 提供公共静态的获取该私有类对象的方法。

要点总结

Singleton 模式中的实例构造器可以设置为 protected 以允许子类派生。
Singleton 模式一般不要支持拷贝构造函数和 Clone 接口,因为这有可能导致多个对象实例,与 Singleton 模式的初衷违背。
如何实现多线程环境下安全的 Singleton? 注意对双检查锁的正确实现。

代码实现

饿汉式,详见 饿汉式,测试类 饿汉式 - 测试

懒汉式,写法大致有如下四种:

无锁懒汉式,详见 无锁懒汉式,测试类 无锁懒汉式 - 测试

同步锁懒汉式,详见 同步锁懒汉式,测试类 同步锁懒汉式 - 测试

双重锁检查懒汉式,详见 双重锁检查懒汉式,测试类 双重锁检查懒汉式 - 测试

内部类懒汉式,详见 内部类懒汉式,测试类 内部类懒汉式 - 测试

注册登记式,写法大致有如下两种:

Map 容器注册登记式,详见 Map 容器注册登记式,测试类 Map 容器注册登记式 - 测试

枚举注册登记式,详见 枚举注册登记式,测试类 枚举注册登记式 - 测试

序列化式,详见 序列化式,测试类 序列化式 - 测试

正文完
 0