一、单例模式
单例模式是一种设计模式,它具有以下特征:
1、单例类仅有一个实例;
2、单例类自行实例化;
3、向整个系统提供该实例。
二、饿汉式单例模式
public class EagerSingleton {
private static EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {
};
public static EagerSingleton getInstance() {
return instance;
}
}
上例便实现了单例模式(饿汉式),它具有如下特征:
1、构造方法私有,避免在其它类使用new关键字创建该类实例对象;
2、自行创建实例对象,并将其私有;
3、提供get方法获取该实例对象,该方法被public static修饰,可通过"类名.方法名"调用。
下面通过一段代码来进一步了解一下:
public class Test1 {
public static void main(String[] args) {
EagerSingleton es1 = EagerSingleton.getInstance();
System.out.println("es1:" + es1);
es1 = null;
System.out.println("es1:" + es1);
EagerSingleton es2 = EagerSingleton.getInstance();
System.out.println("es2:" + es2);
}
}
输出结果如下:
从上面的输出结果可以看出,通过两次调用getInstance()方法获得的是同一个对象的地址值,并且对第一个对象赋null值,只是清除了其所存储的地址值,并不会对单例类的实例对象作出改变。
单例模式(饿汉式)的另一种表达方式:
public class EagerSingleton {
public static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {
};
}
其特征是:
1、私有化构造方法;
2、提供一个实例对象,该实例对象被public static final修饰,public使外部类可访问该对象,static的作用是外部可通过“类名.变量名”访问该对象,final确保该对象不被修改。
二、懒汉式单例模式
public class LazySingleton {
private static LazySingleton instance=null;
private LazySingleton() {
};
synchronized public static LazySingleton getInstance(){
if(instance==null){
instance=new LazySingleton();
}
return instance;
}
}
从上面代码可以看出,懒汉式单例模式与饿汉式单例模式相比,懒汉式单例模式仅在getInstance()方法被调用时才会创建实例对象,而饿汉式单例模式在类加载时会自行创建实例对象。
另外,需要注意的是,懒汉式单例模式需要对getInstance()方法进行同步化,以处理多线程环境。