單例模式限制了使用這個模式的類只能產生一個對象。有一些對象其實我們完全只需要一個即可,如:線程池(threadpool)、緩衝(cache)、註冊表(registry)的對象、裝置的驅動程式的對象等等。事實上,這些類的對象只能有一個執行個體,如果製造出多個執行個體,就會導致許多問題的產生,例如:程式的行為異常、資源的過量使用、產生不一致的結果等等。Java
Singleton模式就為我們提供了這樣實現的可能。是用Singleton的好處還在於可以節省記憶體,因為它限制了執行個體的個數,有利於Java記憶體回收(garbage collection)。
下面我就用代碼來實現一個Singleton模式:
public class Singleton {private static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}}
註解:
static這個關鍵字,它是Singleton模式的核心。
1.Singleton類的成員變數instance被聲明為staitc就意味著這個成員變數只有一份(而不是每個對象一份)。
2.getInstance()這個方法是static的就是說,這個方法在Singleton這個類沒有被執行個體化的時候就能使用。
3.當Singleton這個類被載入的時候(即:執行Singleton singleton1 = Singleton.getInstance();這句話的時候,注意不是這句話Singleton singleton1; ),這個類的靜態成員變數instance被初始化(private
static Singleton instance = new Singleton(); 這句話被執行),然後(注意是先初始化,再調用)調用getInstance()方法返回這個成員變數instance,當執行Singleton singleton2 = Singleton.getInstance();這句話的時候,因為instance被聲明成static,因此,private
static Singleton instance = new Singleton(); 不會被(注意是不會被)再次調用,而是直接調用getInstance()方法,返回同一個instance。這樣就實現了Singleton這個模式。
下面是一些擴充,既然我們能夠限制類只能產生一個對象,那麼就能限制它最多產生指定數量個對象,代碼如下:
public class Singleton { private Singleton(){} private static int count = 0; public synchronized static Singleton getInstance() { if(count < 10){ count++; return new Singleton(); }else{ return null; } } }