java設計模式之單例模式

單例模式是最爲簡單地一種模式,其定義爲:Ensure a class has only one instance, and provide a global point of access to it. 一句話就是說,確保某一個類僅僅只有一個實例化對象,並提供全局訪問接口。
一個符合單例模式的類,其類圖通常如下:
這裏寫圖片描述

public class Singleton {
    private static final Singleton singleton = new Singleton();
    //私有化構造方法
    private Singleton(){

    }
    //類中其他功能代碼,儘量採用static 方式
    public static void doSomething(){

    }
    //返回該類實例化對象
    public static Singleton getInstance(){
        return singleton;
    }
}

其特點在於:

  1. 類的實例對象在類內部完成(最好在初始化時完成)
  2. 私有化類的構造方法,不允許外部構造類的實例
  3. 提供靜態方法供外部獲取實例對象

    另外,單例模式還有另外一種線程不安全的實現方式如下,之所以說其線程不安全,是考慮到系統壓力增大,當有多個線程同時獲取該類尚未實例化的對象時,部分線程可能剛執行到判斷對象爲空,準備新建一個新的對象,而在這之前一丟丟,有部分線程剛執行完這個判斷,這個時候他們正準備新建對象。這種情況下,就會出現系統同時會創建多個類的對象。當然,開發者可以通過Sychronized關鍵字實現同步,避免這個問題。然而這就麻煩了。

public class Singleton {
    private static  Singleton singleton = null;
    public static int i = 0;
    //私有化構造方法
    private Singleton(){

    }
    //類中其他功能代碼,儘量採用static 方式
    public static void doSomething(){

    }
    //將類的實例化,放到首次調用獲取實例時
    public static Singleton getInstance(){
        if (null == singleton)
            singleton = new Singleton();
        return singleton;
    }
}

單例模式的最佳實現方式還是第一種,在對象初始化獲得其實例對象。考慮這種思路,我們也可以實現“二例”、“三例”乃至“N例”模式,即在初始化時,獲得一個對象數組或隊列,通過改寫getInstance()方法,提供對對象池中的對象可控訪問接口。
單例模式,說到底,就是使整個系統中該類的實例對象僅有同一個。其優勢也顯而易見,佔用系統資源少,全局共享。一般用於需要頻繁創建和銷燬某種對象時。
對於上圖中的,doSomething()方法,即類中其他業務代碼儘量採用static的方式實現,是書作者的觀點。個人認爲,在不採用靜態方法也能實現的情況下,由於靜態方法或者說靜態變量在整個系統初始化時,將在JVM永久區內存(參見JVM內存分配原理)中獲得內存空間,基於這樣的考慮,我認爲過多的採用static方式,將削弱單例模式在系統資源佔用方面的優勢作用。更何況,對於公共靜態方法,我們本就能採用類名直接訪問,而且還不會新建對象實例,在這種情況下,單例模式更像是一種累贅。當然,這些只是基於我個人目前的認知,有其他觀點,歡迎提出共同探討。

發佈了40 篇原創文章 · 獲贊 90 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章