單例模式的三種實現 以及各自的優缺點


 單例模式:單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。這個類稱為單例類。

單例模式有三種:懶漢式單例,餓漢式單例,登記式單例。
1.懶漢式單例

public class Singleton {
    private static Singleton singleton;
    private Singleton() {}  //此類不能被實例化
    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

優點:第一次調用才初始化,避免內存浪費。

缺點:必須加鎖synchronized 才能保證單例,(如果兩個線程同時調用getInstance方法,會chuxia)但加鎖會影響效率。
2.餓漢式單例

public class Singleton {
    private static final Singleton SINGLETON = new Singleton();
    private Singleton() {}  //此類不能被實例化
    public static Singleton getInstance() {
        return SINGLETON;
    }
}

優點:沒有加鎖,執行效率會提高。

缺點:類加載時就初始化,浪費內存。
3.登記式模式(holder)

public class Singleton {
    private Singleton() {} //構造方法是私有的,從而避免外界利用構造方法直接創建任意多實例。
    public static Singleton getInstance() {
        return Holder.SINGLETON;
    }
    private static class Holder {
       private static final Singleton SINGLETON = new Singleton();
    }
}

內部類只有在外部類被調用才加載,產生SINGLETON實例;又不用加鎖。此模式有上述兩個模式的優點,屏蔽了它們的缺點,是最好的單例模式。

-----

說明:之前一直不太清楚幾個模式之間的區別;也不曉得單例模式的注意點,就知道個概念吧。這次在同事的督促下寫完一個單例,然后聽他講了三個單例以及之間的區別,有種豁然開朗的感覺。貌似最后一個模式是我之前一直沒理解的。分享之,希望大家都能弄懂單例~ 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM