有些时候,允许自由创建某个类的实例没有
意义,还可能造成系统性能下降(
创建对象带来的系统开销问题),例如:整个系统只有一个窗口管理器,只有一个假脱机打印
设备;JavaEE应用中可能只需要一个数据库引擎访问点,Hibernate访问只需要一个SessionFactory实例,如果在系统中为它们创建多个实例就没有意义了。
如果一个类始终只能创建一个实例,那么这个类就是单例类,这种模式就叫做
单例模式。
spring而言,可以配置Bean实例时指定scope=“singleton”来配置单例模式,不仅如此如果配置<bean../>元素时没有指定scope属性,则该Bean实例默认是单例模式。
为了避免程序自由
创建类的实例,使用private修饰该类的构造方法,从而将该类的
构造器隐藏起来。
将该类的构造器隐藏起来,则需要提供一个public方法作为该类的访问点,用于创建该类的对象,且该方法必须是static修饰(因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象,只能是类)。
出此之外,该类还必须缓存已经创建的对象,否则该类不知道是否曾经创建过实例,也就无法保证只创建一个实例。为此该类需要使用一个静态属性来保存曾经创建的实例,且该属性可以被
静态方法访问,所以该属性也应该用static修饰。
基于上面的介绍,下面创建一个单例类
class Singleton{
// 用一个变量缓存曾经创建的实例
private static Singleton
instance;
//将构造器使用private修饰,隐藏该构造器
private Singleton(){}
// 提供一个静态方法返回Singleton
public static synchronized Singleton getSingleton(){
// 如果instance=null,表明还不曾创建实例
if(instance==nul){
instance = new Singleton();
}
// 如果instance〈〉null,表明曾创建实例
else{
return instance;
}
}
}