单例模式 Singleton

动机

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

百度百科定义

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

Java中单例定义

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

单例解决了什么问题?

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

单例应用场景

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

单例命名

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

单例通用设计规则

1. 私有化类构造器。
2. 定义静态私有的类对象。
3. 提供公共静态的获取该私有类对象的方法。

要点总结

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

代码实现

  1. 饿汉式,详见 饿汉式,测试类 饿汉式-测试
  2. 懒汉式,写法大致有如下四种:

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

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

Phil
6 声望1 粉丝

热爱技术,终生学习