1.意图
确保一个类只有一个实例,并提供一个全局访问点。
2.解释
- 确保只创建一个特定类的一个对象。
- 在软件工程中,单例模式是将类的实例化限制为一个对象的软件设计模式。当需要一个对象来协调整个系统的动作时,这是非常有用的。
3.使用场景
- 必须只有一个类的一个实例,并且必须可以从一个众所周知的接入点访问客户端。
- 当唯一的实例应该通过子类化可扩展,并且客户端应该能够使用扩展实例而不修改它们的代码。
4.单例的几种形式
1.饿汉模式
public class IvoryTower {
private IvoryTower() {
}
private static final IvoryTower INSTANCE = new IvoryTower();
public static IvoryTower getInstance() {
return INSTANCE;
}
}
2.懒汉模式
public class InitializingOnDemandHolderIdiom {
private InitializingOnDemandHolderIdiom() {
}
public static InitializingOnDemandHolderIdiom getInstance() {
return HelperHolder.INSTANCE;
}
private static class HelperHolder {
private static final InitializingOnDemandHolderIdiom INSTANCE = new InitializingOnDemandHolderIdiom();
}
}
3.懒汉模式(线程安全)
public class ThreadSafeLazyLoadedIvoryTower {
private static ThreadSafeLazyLoadedIvoryTower instance;
private ThreadSafeLazyLoadedIvoryTower() {
if (instance != null) {
throw new IllegalStateException("Already initialized.");
}
}
public static ThreadSafeLazyLoadedIvoryTower getInstance() {
if (instance == null) {
instance = new ThreadSafeLazyLoadedIvoryTower();
}
return instance;
}
}
4.懒汉模式(线程安全双检测)
public class ThreadSafeDoubleCheckLocking {
private static volatile ThreadSafeDoubleCheckLocking instance;
private ThreadSafeDoubleCheckLocking() {
if (instance != null) {
throw new IllegalStateException("Already initialized.");
}
}
public static ThreadSafeDoubleCheckLocking getInstance() {
ThreadSafeDoubleCheckLocking result = instance;
if (result == null) {
synchronized (ThreadSafeDoubleCheckLocking.class) {
result = instance;
if (result == null) {
instance = result = new ThreadSafeDoubleCheckLocking();
}
}
}
return result;
}
}