定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.
单例模式的通用类图如下:
单例模式的优点:
单例模式的缺点:
1.高并发情况下,注意线程同步问题
这是一个线程不安全的单例
该单例模式在低并发的情况下可能不会出现问题,若并发量增加就可能在内存中出现多个实例,破坏了最初的预期.
解决线程不安全的方法有很多,可以在 getInstance 方法前加 synchronized 关键字,也可以在方法内增加 synchronized实现,这种被称为懒汉式单例,还有一种饿汉式单例,代码如下:
2.对象被复制的情况
在Java中,对象默认是不可以被复制的,若实现了Cloneable接口,并实现了clone方法,则可以直接通过对象复制方式创建一个新对象,对象复制是不用调用类的构造函数的,因此即使是私有的构造函数,对象仍然可以被复制. 一般情况下,类复制的情况是不用考虑的,很少会出现一个单例类会主动要求被复制的情况,解决该问题的最好方法就是单例类不要实现Cloneable接口
单例模式是23个模式中比较简单的模式,应用也很广泛,如在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理这些Bean的生命期,决定什么时候创建出来,什么时候销毁,销毁的时候要如何处理,等等.