泛型 + Singleton Patterns

聽起來 singleton 跟 generic 好像搭不上邊, 不過搭配 .net framework 2.0 的 generic 機制, 倒是可以讓 singleton 好做很多… 我先簡單寫一下不使用 generic 時的做法…

只有單一 class 要實作 singleton 很簡單, 只要寫這樣的 code 就可以:

public class SampleSingletonClass
{
    private static SampleSingletonClass _instance = null;
    public static SampleSingletonClass Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new SampleSingletonClass();
            }

            return _instance;
        }
    }

    private SampleSingletonClass()
    {
        //
        // ToDo: constructor code here.
        //
    }
}

很標準的 code, 不是嗎? 不過問題來了… 當我有第二個 class 也要套用 singleton patterns 時, 幾乎一樣的 code 就得再抄一次, 只因為 public static XXX Instance; 這個 static property 的型別不一樣, 很討厭…

這堆看起來差不多的 code 想要省掉, 那只好動點手腳, 用繼承的技術解決, 不過問題又來了, 型別的宣告… 就像一堆 Collection 物件一樣, 傳回型別宣告為 object 就好了, 不過這樣的 code 用起來實在麻煩… 寫起來就像這樣:

public class SingletonBase
{
    public static SingletonBase Instance(Type seed)
    {
        if (_singleton_storage[seed] == null)
        {
            _singleton_storage[seed] = Activator.CreateInstance(seed);
        }

        return _singleton_storage[seed] as SingletonBase;
    }

    private static Hashtable _singleton_storage = new Hashtable();
}

public class SingletonBaseImpl1 : SingletonBase
{
    public SingletonBaseImpl1()
        : base()
    {
        Console.WriteLine("SingletonBaseImpl1.ctor() called.");
    }
}

public class SingletonBaseImpl2 : SingletonBase
{
    public SingletonBaseImpl2()
        : base()
    {
        Console.WriteLine("SingletonBaseImpl2.ctor() called.");
    }
}

看來不怎麼漂亮? 不過看在重複的 code 只寫一次就好的份上, 醜一點關起門來就看不到了. 不過這樣就沒事了? 不… 用起來更醜… [:’(]

SingletonBase.Instance(typeof(SingletonBaseImpl1));
SingletonBase.Instance(typeof(SingletonBaseImpl1));
SingletonBase.Instance(typeof(SingletonBaseImpl1));

SingletonBase.Instance(typeof(SingletonBaseImpl2));
SingletonBase.Instance(typeof(SingletonBaseImpl2));
SingletonBase.Instance(typeof(SingletonBaseImpl2));

實在無法接受這種 quality 的 “class library” … 這種 code 看起來一點美感都沒有, 就像文筆不好的人在寫文章一樣…

處女座的個性, 實在不能容忍這種 code 出現在我的 project 裡… 碰到這種問題, 直覺的解決辦法就是:

  1. 透過 inherence, 把這些重複的 code 集中到 super class 一次解決
  2. 同樣邏輯, 要套用到不同型別的應用, 就用 generic 的方式處理

不過要實作還沒那麼簡單, 試了半天, 總算找出一種看起來最得意的解法… <待續>






Facebook Pages

Edit Post (Pull Request)

Post Directory