程序员(包括我)笔试时经常会看到这么一道题目:请写出一个单例类出来。
由于头脑中早就熟透了,刷刷就写好了。
主要有两种形式:
第一种;
public class Singleton {
private Singleton(){};
//在自己内部定义自己的一个实例,注意是private的,仅限内部使用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问的方法
public static Singleton getInstance(){
return instance;
}
}
第二种:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance(){
//这里不用每次都生成对象,知识第一次使用时生成实例,提高效率
if ( instance == null ){
instance = new Singleton();
}
return instance;
}
}
在测试时,只需要调用getInstance()方法即可,产生的对象都是同一个。
框架中有很多地方都用到了单例模式:Hibernate在创建SessionFactory时,只需要一个实例。Spring在配置Bean实例时可以指定scope="singleton"来声明单例模式。
在第二种方法中用到了synchronized来修饰方法,保证了该方法是同步的,只能生成一个。
使用单例模式的优势可以减少创建Java实例带来的系统开销,方便跟踪Java实例的声明周期和状态。