【大話設計模式之——單例模式(Singleton pattern)】

常見的五種單例模式實現方式及其特點
– 主要:
. 餓漢式(線程安全,調用效率高。 但是,不能延時加載。)
. 懶漢式(線程安全,調用效率不高。 但是,可以延時加載。)
– 其他:
. 雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題。不建議使用)
. 靜態內部類式(線程安全,調用效率高。 但是,可以延時加載)
. 枚舉式(線程安全,調用效率高,不能延時加載。並且可以天然的防止反射和反序列
化漏洞!)
. 如何選用?
– 單例對象 佔用 資源 少,不需要 延時加載:
. 枚舉式 好於 餓漢式
– 單例對象 佔用 資源 大,需要 延時加載:
. 靜態內部類式 好於 懶漢式

      單例模式只生成一個實例,減少了系統性能開銷,當一個對象的產生需要比較多的資源時,如讀取配置、產生其他依賴對象時,則可以通過在應用啓動時直接產生一個單例對象,然後永久駐留內存的方式來解決。

餓漢式:

public class Singleton {
    private static /*final*/ Singleton s = new Singleton();
    private Singleton(){} //私有化構造器
    public static /*synchronized*/ Singleton getInstance(){
        return s;
    }
}

懶漢式:

public class Singleton {
    private static Singleton s;
    private SingletonDemo01(){} //私有化構造器
    public static synchronized Singleton getInstance(){
        if(s==null){
            s = new Singleton();
        }
        return s;
    }
}

雙重檢測鎖:

public class SingletonDemo03 {
    private static Singleton instance = null;
    public static Singleton getInstance() {
    if (instance == null) {
        SingletonDemo03 sc;
        synchronized (Singleton.class) {
        sc = instance;
        if (sc == null) {
            synchronized (Singleton.class) {
            if(sc == null) {
                sc = new Singleton();
            }
            }
            instance = sc;
        }
        }
        }
    return instance;
    }
    private Singleton() {
    }
}

靜態內部類方法:

public class Singleton {
    private static class SingletonClassInstance {
        private static final Singleton instance = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonClassInstance.instance;
    }
    private Singleton() {
    }
}

枚舉模式:

public enum SingletonDemo05 {
    /**
    * 定義一個枚舉的元素,它就代表了Singleton的一個實例。
    */
    INSTANCE;
    /**
    * 單例可以有自己的操作
    */
    public void singletonOperation(){
    //功能處理
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章