1. 程式人生 > >[設計模式] - No.8 Singleton模式

[設計模式] - 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的引用為空,所以會建立一個新的例項物件。在後續呼叫的時候,都只返回這一個例項即可。