單例模式

一. 定義:java

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

    初始化時實例化併發

    構造函數設置爲私有訪問權限,禁止外部建立對象ide

    其餘類對該類的訪問均可以經過getInstance得到同一個對象函數

public class Singleton {
private static Singleton singleton = null;
/**
* 限制產生多個對象
*/
private Singleton() {
}
/**
* 經過該方法得到實例對象
* @return
*/
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
/**
* 類中其餘方法,儘可能是static
*/
public static void dosomething() {
}
}

二. 單例模式優缺點:
高併發

    單例模式的優勢:工具

        -- 因爲單例模式在內存中只有一個實例,減小了開支,特別是一個對象須要頻繁地建立銷燬時性能又沒法優化時;性能

        -- 減小性能開銷。當一個對象的產生須要比較多的資源時,如讀取配置、產生其餘依賴對象時,可經過在應用啓動時直接產生一個單例對象,而後永久駐留在內存的方式來解決;測試

        -- 單例對象能夠避免對資源的多重佔用。(避免對同一個資源文件的同時寫操做);優化

        -- 能夠在系統設置全局訪問點,優化和共享資源訪問。

    缺點:

        -- 單例模式通常沒有接口,擴展很困難;

        -- 單例模式對測試是不利的。在並行開發環境中,若是單例模式沒有完成,是不能進行測試的,沒有接口也不能使用mock的方式虛擬一個對象;

        -- 單例模式與單一職責原則有衝突。一個類應該只是實現一個邏輯,而不關心它是不是單例的。

三. 狀態模式的使用場景及注意事項

    1.使用場景:

        要求生成惟一序列號的環境;

        在整個項目中須要一個共享訪問點或共享數據;

        建立一個對象須要消耗的資源過多,如要訪問IO和數據庫等資源;

        須要定義大量的靜態常量和靜態方法(如工具類)的環境。

        Spring中的bean默認就是單例。這樣作Spring容器能夠管理這些Bean的生命週期,決定這些bean的建立、銷燬等。

    2.注意事項:

        高併發狀況下,注意單例模式的線程同步問題。

相關文章
相關標籤/搜索