一.什么是单例模式?
定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例
二.类图如下:
三.类图解析
Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的
四.单例模式的优点
由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象频繁的创建、销毁时,并且创建或销毁时性能无法优化,单例模式的优势就非常明显了
五.单例模式的缺点
单例模式一般没有接口,扩展很困难。另外单例模式与单一职责原则有冲突,一个类应该只实现一个逻辑,而不关心它是否是单例的
六.单例模式的应用场景
1.要求生成唯一序列号的环境
2.在项目中需要一个共享访问点或共享数据时,如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的
3.创建一个对象需要消耗过多资源,如要访问IO和数据库等资源
4.需要定义大量的静态常量和静态方法的环境,可以采用单例模式
七.单例模式的注意事项
1.注意单例模式的线程安全的问题,尤其是在高并发的情况下
2.要考虑对象的复制情况。在java中对象默认是不可以被复制的,若实现了Cloneable接口,并实现了clone方法,则是可以通过对象复制方式创建一个新对象,对象复制是不需要调用类的构造函数,因此即使是私有的构造函数,对象仍然可以被复制
八.Spring对单例模式的应用
在Spring中,每个Bean默认都是单例的,这样的优点是Spring容器可以管理Bean的生命周期,决定什么时候创建,什么时候销毁,销毁的时候需要做什么处理等等