单例模式的七种方式
一、饿汉模式
package com.zero.singleton;
public class HungryModel {
public static final HungryModel instance = new HungryModel();
private HungryModel() {}
public static HungryModel getInstance() {
return instance;
}
}
二、懒汉模式
package com.zero.singleton;
public class LazyModel {
private static LazyModel instance;
private LazyModel() {}
public static LazyModel getInstance() {
if(instance == null) {
instance = new LazyModel();
}
return instance;
}
}
三、懒汉+同步
package com.zero.singleton;
public class SafeLazyModel {
private static SafeLazyModel instance;
private SafeLazyModel() {}
public static synchronized SafeLazyModel getInstance() {
if(instance == null) {
instance = new SafeLazyModel();
}
return instance;
}
}
四、DCL
package com.zero.singleton;
public class DCLModel {
private static DCLModel instance;
private DCLModel() {}
public static DCLModel getInstance() {
if(instance == null) {
synchronized (DCLModel.class) {
if(instance == null) {
instance = new DCLModel();
}
}
}
return instance;
}
}
五、Volatile+DCL
package com.zero.singleton;
public class DCLModel2 {
private volatile static DCLModel2 instance;
private DCLModel2() {}
public static DCLModel2 getInstance() {
if(instance == null) {
synchronized (DCLModel2.class) {
if(instance == null) {
instance = new DCLModel2();
}
}
}
return instance;
}
}
六、Holder
package com.zero.singleton;
public class HolderModel {
private HolderModel() {}
private static class Holder{
private static HolderModel instance = new HolderModel();
}
public static HolderModel getInstance() {
return Holder.instance;
}
}
七、枚举
package com.zero.singleton;
public class EnumModel {
private EnumModel() {}
private enum EnumModelHolder {
INSTANCE;
private EnumModel instance = null;
EnumModelHolder() {
this.instance = new EnumModel();
}
private EnumModel getInstance() {
return instance;
}
}
public static EnumModel getInstance() {
return EnumModelHolder.INSTANCE.instance;
}
}