1. 程式人生 > >單例模式的使用及實現

單例模式的使用及實現

核心作用:保證一個類只有一個例項,並且提供一個訪問該例項的全域性訪問點

什麼時候使用單例模式?

舉一個小例子,在我們的windows桌面上,我們打開了一個回收站,當我們試圖再次開啟一個新的回收站時,Windows系統並不會為你彈出一個新的回收站視窗。也就是說在整個系統執行的過程中,系統只維護一個回收站的例項。這就是一個典型的單例模式運用。

我們在實際使用中並不存在需要同時開啟兩個回收站視窗的必要性。假如我每次建立回收站時都需要消耗大量的資源,而每個回收站之間資源是共享的,那麼在沒有必要多次重複建立該例項的情況下,建立了多個例項,這樣做就會給系統造成不必要的負擔,造成資源浪費。

同樣,對於一些應用程式的日誌應用,或者web開發中讀取配置檔案都適合使用單例模式,如HttpApplication 就是單例的典型應用。

從上述的例子中我們可以總結出適合使用單例模式的場景和優缺點:  

適用場景: 1.需要生成唯一序列的環境

                   2.需要頻繁例項化然後銷燬的物件。

                   3.建立物件時耗時過多或者耗資源過多,但又經常用到的物件。 

                   4.方便資源相互通訊的環境


 優點:1.實現了對唯一例項訪問的可控

               2.對於一些需要頻繁建立和銷燬的物件來說可以提高系統的效能。

 缺點:1. 不適用於變化頻繁的物件
               2.濫用單例將帶來一些負面問題,如為了節省資源將資料庫連線池物件設計為的單例類,可能會導致共享連線池物件的程式過多而出現連線池溢位。

               3.如果例項化的物件長時間不被利用,系統會認為該物件是垃圾而被回收,這可能會導致物件狀態的丟失。

實現 :  使用靜態內部類,藉助JVM。

這種內部類與其外部類之間並沒有從屬關係,載入外部類的時候,並不會同時載入其靜態內部類,只有在發生呼叫的時候才會進行載入,而且執行緒呼叫內部靜態類,虛擬機器只會初始化一次,當靜態內部類下次被呼叫,發現已經被初始化了,就直接引用了

code:

public class ClassInnerClassDanli {
    public static class DanliHolder{
        private static ClassInnerClassDanli dl = new ClassInnerClassDanli();
    }

    public static ClassInnerClassDanli getInstance(){
        return DanliHolder.dl;
    }

    private ClassInnerClassDanli(){}
}

 



refer:https://blog.csdn.net/Mr_PH/article/details/77898243