單例模式

  1. 核心原理:
    • 構造函數(shù)私有化
    • 通過靜態(tài)方法獲取唯一實例
  2. 優(yōu)點
    • 在內(nèi)存中只有一個實例,減少內(nèi)存開支與系統(tǒng)性能開銷
    • 避免對資源的多重占用
    • 全局訪問
  3. 缺點
    • 一般沒有接口,擴展困難,需要修改代碼
    • 單例如果持有Context,容易引發(fā)內(nèi)存泄漏。如果必須持有一般是用Application

餓漢模式

public class Singleton{
    private static Singleton sInstance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return sInstance;
    }
}

懶漢模式

public class Singleton{
    private static Singleton sInstance = null;
    private Singleton(){}
    public static synchronized Singleton getInstance(){
        if(sInstance == null){
            sInstance = new Singleton();
        }
        return sInstance;
    }
}

雙檢測鎖定模式

jdk1.5以上有volatile關鍵字,低版本可能出現(xiàn)DCL失效

public class Singleton{
    private static volatile Singleton sInstance = null;
    private Singleton(){}
    public static Singleton getInstance(){
        if(sInstance == null){
            sychnorized(Singleton.class){
                if(sInstance == null){
                    sInstance = new Singleton();
                }
            }
        }
        return sInstance;
    }
}

靜態(tài)內(nèi)部類**

推薦方式,利用類加載機制

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

枚舉

可避免反序列化時重新生成對象,前面幾種方法要避免此情況,可以加入readResolve。

public enum SingletonEnum{
    INSTANCE;
}

容器

如利用hashmap 使用key獲取對象等。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容