1. 程式人生 > >Java 設計模式 ------ 單例模式

Java 設計模式 ------ 單例模式

stat out instance bsp 問題 構造函數 程序開發 div .cn

  在程序開發中,有時我們只需要一個對象就可以了,如日誌對象,工具類,怎麽樣保證整個應用程序中有且只有一個對象呢?這就要用到單例模式了,通過名字就可以看出來,它就是保證整個應用程序中只有一個實例的。單例,單例,就是單個實例。現在我們就看一下怎麽用Java代碼實現單例模式。

  首先用Eclipse 創建一個Java項目,然後在src目錄下新建一個Singleton類,這個類就是用於創建單個對象,再新建一個Test類用於測試,最好還是指定一個包名

技術分享圖片

  我們都知道創建對象上時候,要調用類的構造函數,但是每調用一次,都會創建一個新的對象,這和我們的創建單個對象不符。那要怎麽辦呢?首先不能讓外界調用類的構造函數,就是讓構造函數函私有化

// 構造函數私有化
private Singleton() {
        
}

  構造函數私有化之後,我們不能在外面創建對象了,但又引來了另外一個問題,我們需要的那一個對象也無法創建了,這就要對外提供一個方法來創建對象。我們在本類中創建一個對象,然後提供一個方法暴露出去,因為我們在本類是可以調用構造函數的。

    // 對象的唯一實例
    private static Singleton instance = new Singleton();
    
    // 提供一個用於獲取實例的方法
    public static Singleton getInstance() {
        
return instance; }

  這時我們就可以在外面通過類名獲取了,在Test類中測試一下

public class Test {

    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        
        System.out.println(s1 == s2);  // true
    }

}

  創建的兩個對象s1, s2相等,證明,它們是同一個對象。以上單例模式的創建方式稱之為‘餓漢式‘,因為當類一加載的時候,這個唯一的對象就創建了。

  現在我們再來考慮創建單例對象的另外一種模式, 稱之為‘懶漢式’, 就是我們在聲明私有屬性的時候,不去創建對象,只有在調用實例的時候才會去創建單例對象;

public class Singleton {
    
    // 構造函數私有化
    private Singleton() {
        
    }
    
    // 只聲明了一個對象,而沒有進行賦值
    private static Singleton instance;
    
    // 提供一個用於獲取實例的方法
    public static Singleton getInstance() {
        if(instance == null) {  // 當第一次調用的時候,創建單例對象
            instance = new Singleton();
        }
        return instance;
    }
}

   

Java 設計模式 ------ 單例模式