在特定情況下,我們會希望某一些類別的物件只有一個,通常會用global variable 讓它是靜態變數。(例如設計一個學校系統,這個系統只有一個註冊單位可以合法讓學生註冊,我們就必須確保註冊單位這個物件在程式中只能有一個)。
這個做法的缺點就是會在程式剛開始就宣告這個變數,也會佔用記憶體位置,即使我們可能還沒用到它,或是已經用完了,還是得放著程式結束。如果程式剛好有很多靜態變數的需求,就容易拖垮程式的執行效率或是浪費記憶體容量。
單例模式可以讓我們在需要的時候宣告變數,不需要用靜態方式宣告,而且還能確保整個程式不會不小心出現另一個一樣的變數,一樣可以讓我們在程式運行的任何時候去使用該變數。
將建構子設成 private
,就無法從外部重複建構這個物件,getInstance()
可以確認物件是否為空值,去決定要不要建立。
public class Singleton {
private static Singleton uniqueInstance;
// other useful instance variables here
private Singleton() {};
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// other useful methods here
}
Disclaimer
因為讀的是原文版,所以難免會有翻譯詞不達意或是專有名詞上的差異,有錯誤的話歡迎在留言區一起交流!