Singleton Pattern -- 唯一的物件個體

用的時間點

通常我們在啟動程式時,就會產生許多物件個體。拿代表字串的 java.lang.String 類別物件個體來說,每個字串都會相對產生一個,所以如果某個程式內含 1000 個字串,就會產生 1000 個物件個體。

不過,有時候難免會有 讓這個類別的物件個體只產生一個 的需要,像是用程式來表現在程式中絕對是獨一無二的某個部份。好比說,表現電腦的類別或是表現視窗系統的類別等等就是最經典的例子。

如何設計

Singleton 是指只有一個元素的集合,就是因為它只會有一個物件個體。

程式範例

設計一個只有一個物件個體的類別。

Singleton 參與者

Singleton Pattern 只出現一個 Singleton 參與者。 Singleton 的參與者具有 static 方法可取得唯一的物件個體。這個方法永遠都會傳回同一個物件個體。

優點

在很多情況下,如果有一個以上的物件個體時,由於物件個體彼此之間的影響,可能會發展成出乎意料的 bug。Singleton Pattern 確保程式設計師不會不小心多產生物件。

問題

1.將Singleton Pattern 套用到 TicketMaker 類別。

public class TicketMaker {
    private int ticket = 1000;
    public int getNextTicketNumber() {
        return ticket++;
    }
}

目的是為了只保有唯一的一個 TicketMaker。

2.請自製一個物件個體數目只能有3個的類別 Triple。假設所有物件個體都要加上編號,且利用 getInstance(int id)可取得編號 id 的物件個體。

重點是做一個 static array。

3.以下嚴格來說不能算是一個 Singleton Pattern,為什麼?

public class Singleton {
    private static Singleton singleton = null;
    private Singleton() {
        System.out.println("已產生物件個體。");
    }
    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

因為在多執行緒的狀態下,呼叫 getInstance 可能會產生多個物件。 例如:

在 getInstance 方法前加上 synchronized 即可解決。