Singleton Pattern

使用時機:只需要一個也只能有一個
例子:Thread pool、Cache、Registry、Login user
大量製造會導致許多問題;比如行為異常、資源使用過量或不一致的結果

現行的程式環境,資源是有限的。記憶體、共用的區塊、以及程式片段,在存取、操作以及安全上都應該只存在一個實體。
雖然利用靜態全域變數可達到讓其他程式存取變數值及程式間約定好的物件,但它仍存在一些缺點,例如:物件一開始就必須建立好,但若程式過程中沒有使用到這個物件的話,就形成了資源的浪費。
因此,透過獨體模式可讓物件在被需要的時候才建立物件。

code:
public ClassA {
private static Singleton uniqueInstance; // 紀錄實體
private ClassA() {} // 建構子, 但宣告為 private 後將沒有人可以使用, 所以需要一個類別方法
public static Singleton getInstance() { // 類別方法, 靜態方法, 依附在類別上而非物件上
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}

Lazy Instantiaze(拖延實體化):需要時才產生。這是獨體模式的一個特色。
若加入了“多執行緒”的功能後,會造成問題。程式在執行時有互相重疊的部分,有幾個方式可以解決:
1. 同步化的方法,但會降低效率
2. 率先建立實體而不是 Lazy instaniaze,存取實體前一定會先建立此實體,能改善第一種方法造成的效率下降,且保證安全
3. Double-Checked Locking
Code:
...
private volatile static Roller_Coaster uniqueInstance; // volatile 確保當 uniqueInstance 被實體化時,多個執行緒處理 uniqueInstance 的做法是正確的
public static Roller_Coaster getInstance() {
if(uniqueInstance == null) {
lock(Roller_Coaster.uniqueInstance) { // .NET 的做法, JAVA 使用 Synchorized 關鍵字, 確保不被改寫
if(uniqueInstance == null) {
uniqueInstance = new Roller_Coaster();
}
}
}
}

arrow
arrow
    文章標籤
    Design Pattern Singleton Pattern
    全站熱搜

    Nola 發表在 痞客邦 留言(0) 人氣()