設計模式-創建模式之單例模式

單例模式:最簡單的一種設計模式

單例模式,確保一個類只有一個實例,並且自行實例化並向整個系統提供這個實例

java中有兩種單例模式:餓漢式(加載時候就會實例化) 懶漢式(第一次引用時候才進行實例化)

餓漢式:

在類被加載時候 ,靜態變量singLeton會被初始化,調用私有的構造器創建唯一的singLeton實例,提供一個私有的構造方法,以及提供一個公共的返回實例的引用

public class SingLeton {

    public int count = 0;
    static SingLeton singLeton = new SingLeton();
    private SingLeton() {
        
    }
    public static SingLeton getInsance() {
        return singLeton;
    }
}

餓漢式: 返回實例的方法需要同步synchroized 否則 多線程狀態下  會出現多個實例

public class SingLetonLh {

    private SingLetonLh() {
    }
    private static SingLetonLh singLeton = null;
    public static synchronized SingLetonLh getInternec() {
        if(singLeton == null) {
            singLeton = new SingLetonLh();
        }
        return singLeton;
    }
}

餓漢式與懶漢式的區別

1、餓漢式單例實例 被加載時候就會創建,懶漢式則是第一次調用的時候纔會初始化

2、從資源利用效率上說  懶漢式要差一些,但是從反應速度上和反應時間上講,餓漢式要比懶漢式稍好些

3、餓漢式 更符合java語言特點

單例模式的應用:

單例模式的優點:減少內存開支,特別是對一個對象需要頻繁的創建,銷燬,減少了性能開銷,當一個對象的產生需要比較多資源,如讀取配置文件信息等 可以在啓用時  直接產生一個對象,然後永久駐留內存的方式來解決

單例模式的缺點:無法創建子類,對測試不利,與單一職責原則衝突

單例模式的使用場景:

    一個系統中如果要求一個類有且僅有一個實例,當出現多個實例的時候就會哦造成不良反應的時候 就考慮使用單例模式

    要求生成唯一序列號的環境

    在整個項目中需要一個共享訪問或者共享數據

    創建一個對象需要小號過多的資源 如訪問io和數據庫等資源

    需要定義大量的靜態常亮,和靜態方法的環境,可以採用單例模式

使用單例的注意事項:

當系統爲多jvm分佈式  或者一個jvm有多個類加載器  應避免使用有狀態單例(當做狀態庫使用)

如果一個類實現了cloneAble  serializable接口  則有可能反序列化或克隆出一個新的實例類 因此單例不需要實現cloneAble  serializable接口

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

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