单例模式(Singleton Pattern)是一个比较简单的模式,其定义为:Ensure a class has only one instance,and provide a global point of access to it.(确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)
单例模式的优点:
单例模式的缺点:
单例模式的使用场景
在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式,具体的场景如下:
单利模式的扩展
如果一个类可以产生多个对象,对象的数量不受限制,则是非常容易实现的,直接使用new关键字就可以了,如果只要有一个对象,使用单利模式就可以了,但是如果要求一个类只能产生两三个对象呢?该怎么实现呢?
需要产生固定模式数量对象的模式叫做有上限的多例模式,它是单例模式的一种扩展,采用有上限的的多例模式,我们可以在设计时决定内存中有多少个实例,方便系统进行扩展,修正单例模式可能存在的性能问题,提供系统的响应速度。例如读取文件,我们可以在系统启动时完成初始化工作,在内存中启动固定数量的reader实例,然后在需要读取文件时就可以快速响应。
使用单例模式需要注意的一点就是JVM的垃圾回收机制,如果我们的一个单例对象在内存中长久不使用,JVM就认为这个对象是一个垃圾,在CPU资源空闲的情况下该对象会被清理掉,下次再调用时就需要重新产生一个对象。如果我们在应用中使用单例类作为有状态值(如计数器)的管理,则会出现恢复原状的情况,应用就会出现故障。如果确实需要采用单例模式来记录有状态的值,有两种办法可以解决该问题:
1、由容器管理单例的生命周期
Java EE容器或者框架级容器(如Spring)可以让对象长久驻留内存。当然,自行通过管理对象的生命期也是一个可行的办法,既然有那么多的工具提供给我们,为什么不用呢?
2、状态随时记录
可以使用异步记录的方式,或者使用观察者模式,记录状态的变化,写入文件或写入数据库中,确保即使单利对象重新初始化也可以从资源环境获得销毁前的数据,避免应用数据丢失。