原本單純的我一直認(rèn)為這世界上的單例模式缭黔,只有餓漢和懶漢呢,今天發(fā)現(xiàn)了猜惋,原來(lái)單例模式有四種實(shí)現(xiàn)方式侧漓。
餓漢模式
public class Singleton {
/**
* 餓漢式
*/
private Singleton() {
}
private static final Singleton SINGLETON = new Singleton();
public static Singleton getInstance(){
return SINGLETON;
}
public void system(){
System.out.println("---lin---> singleton");
}
}
懶漢模式
public class Singleton2 {
/**
* 懶漢式
*/
private Singleton2() {
}
private static Singleton2 singleton2 = null;
public static Singleton2 getInstance() {
if (singleton2 == null) {
synchronized (Singleton.class) {
if (singleton2 == null) {
singleton2 = new Singleton2();
}
}
}
return singleton2;
}
public void system(){
System.out.println("---lin---> singleton2");
}
}
枚舉模式
public enum Singleton3 {
INSTANCE;
private Singleton3(){
}
public void system(){
System.out.println("---lin---> singleton3");
}
}
Holder模式
public class Singleton4 {
/**
* 帶有Holder的方式
* 類(lèi)級(jí)內(nèi)部類(lèi),也就是靜態(tài)的成員內(nèi)部類(lèi)蛀醉,該內(nèi)部類(lèi)的實(shí)例與外部類(lèi)的實(shí)例沒(méi)有綁定關(guān)系
* 只有被調(diào)用的時(shí)候才會(huì)裝在悬襟,從而實(shí)現(xiàn)了延遲加載
*/
private Singleton4() {
}
private static class SingletonHolder {
/**
* 靜態(tài)初始化器,由JVM來(lái)保證線程安全
*/
public static final Singleton4 INSTANCE = new Singleton4();
}
public static Singleton4 getInstance() {
return SingletonHolder.INSTANCE;
}
public void system() {
System.out.println("---lin---> singleton4");
}
}