2017年7月9日 星期日

GoF - Singleton

  • GoF (1)
    • Creational Patterns 
  • UML
  • Code

public class Singleton
{
    // 因建立物件需要花費許多資源,此一開始就不建立物件
    private static Singleton instance; 
    // [多執行緒] 建立一個靜態惟獨的行程輔助物件
    private static object sync = new object();
    
    private Singleton()
    {
        // 這裡面跑很多 Code
        // 建立物件需要花費許多資源
    }

    public static Singleton getInstance()
    {
        // 1. 第一次被呼叫的時候,instance為null,要建立物件
        // 2. 判斷實體是否存在,不存在再加鎖處理
        if (instance == null)
        {
            // [多執行緒] 加鎖建立物件,只有一個執行緒可以進入
            lock(sync)
            {
                // [多執行緒] 雙重鎖定
                // 當兩個執行緒調用 getInstance
                // 他們都可以夠過第一重 instance == null
                // 由 lock 機制,這兩個執行緒只能一個進入,另一個在外排隊等候
                // 其中一個進入並出來後,另一個才能進入
                // 如沒有第二重 instance == null
                // 第一個執行緒建立實體,第二個執行緒還是可以繼續在建立新的實體
                if(instance == null)
                {
                    instance = new Singleton();
                }
            }
            
        }

        // 已經有物件存在,直接回傳這個物件
        return instance;
    }
}


    Ref: 
    • 7 天學會設計模式-設計模式也可以這樣學
    • 大話設計模式

    沒有留言:

    張貼留言