单件模式定义:确保一个类只有一个实例,并提供一个全局访问点。
简单定义:确保有且只有一个对象被创建。
1、单件模式最简单的实现(多线程下可能出现多个实例,非线程安全):
package headfirst.singleton.classic;
// NOTE: This is not thread safe!
public class Singleton {
private static Singleton uniqueInstance;
// other useful instance variables here
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// other useful methods here
}
2、线程安全,但效率不高的实现:
package headfirst.singleton.threadsafe;
public class Singleton {
private static Singleton uniqueInstance;
// other useful instance variables here
private Singleton() {}
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// other useful methods here
}
3、一种改进(双重判断):
package headfirst.singleton.dcl;
//
// Danger! This implementation of Singleton not
// guaranteed to work prior to Java 5
//
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
4、另一种改进(过早初始化):
package headfirst.singleton.stat;
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return uniqueInstance;
}
}
5、利用内部类解决过早初始化问题:
package headfirst.singleton.subclass;
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return Nested.instance;
}
static class Nested {
static Singleton instance = new Singleton();
}
}