public final class Singleton {
private Singleton() {}
private static final Singleton singleton = new Singleton();
public static Singleton getInstance() {
return singleton;
}
}
懒汉式 ( 第一次调用时实例化 )
public final class Singleton {
private Singleton() {}
private volatile static Singleton singleton;
public static Singleton getInstance() {
if (null == singleton) {
synchronized (Singleton.class) {
if (null == singleton) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
静态内部类 ( 嵌套类,在被使用时加载,仍属于懒汉式 )
public final class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
enum方式
public class Singleton {
private Singleton() {}
private enum SingletonEnum {
INSTANCE;
private Singleton singleton;
// enum的构造方法必须为private(private修饰符多余i)
private SingletonEnum() {
singleton = new Singleton();
}
public Singleton getInstance() {
return singleton;
}
}
public static Singleton getInstance() {
return SingletonEnum.INSTANCE.getInstance();
}
}
登记式 ( 扩展数量,对一组单例模式进行维护;可继承 )
public class RegSingletonManager {
private static Map<String, RegSingletonManager> singletonsMap = new HashMap<>();
static {
RegSingletonManager rsm = new RegSingletonManager();
singletonsMap.put(rsm.getClass().getName(), rsm);
}
// 保护的构造器(供子类使用)
protected RegSingletonManager() {}
public static RegSingleton getInstance(String name) {
if (null == name) {
name = "xxx.RegSingletonManager";
}
if (null == singletonsMap.get(name)) {
try {
singletonsMap.put(name, Class.forName(name).newInstance());
} catch (Exception e) { ... }
}
return (RegSingletonManager) (singletonsMap.get(name));
}
}