[設計模式] - No.8 Singleton模式

Singleton模式

在程序運行的時候常常是使用new的方法創建一個實例。對於某一個類(例如工具類),如果我們希望在任何情況下該類只有一個實例的話,我們需要使用單例模式。單例模式是很簡單又被廣爲使用的一個設計模式:

public class Singleton {

    //餓漢模式
    private static Singleton singleton = new Singleton();
    private Singleton(){
        System.out.println("生成唯一的實例");
    }

    public static Singleton getSingleton(){
        return singleton;
    }
}

在程序運行時,當Singleton首次被加載的時候,我們即創建了一個singleton對象。當getSingleton函數被調用的時候,我們將這個對象的引用返回給外部調用。這樣的話,不管調用多少次,getSingleton函數返回的總是類加載時創建的singleton對象。

可使用Main中的函數判斷兩個實例是否爲同一個對象:

public class Main {

    public static void main(String[] args) {
        Singleton s1 = Singleton.getSingleton();
        Singleton s2 = Singleton.getSingleton();
        System.out.println(s1==s2?"s1 和 s2 相同":"s1 和 s2 不相同");
    }
}

生成唯一的實例
s1 和 s2 相同

上面的方法又被稱爲餓漢模式,因爲他總是在類剛剛加載的時候即創建實例對象。還用一種單例的實現方式被稱爲懶漢模式,實現如下:

public class Singleton {
    //懶漢
    private static Singleton singleton =null;
    private Singleton(){
        System.out.println("生成唯一的實例");
    }
    public synchronized static Singleton getSingleton(){
        if(singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

可以看到,與餓漢模式不同的是,懶漢模式在最初是的時候僅僅創建一個null的空引用,當首次調用getSingleton的時候,由於singleton的引用爲空,所以會創建一個新的實例對象。在後續調用的時候,都只返回這一個實例即可。

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