上篇因為貼 code , 放一起實在太長了, 只好分兩篇... 吊完胃口, 不囉唆了, 直接看我想出來的解法. 原則還是跟一般的函式庫一樣, 我希望先做出一個 base class, 把 singleton 的實作細節都處理掉, 函式庫的目的是讓使用你 lib 的人會很快樂才對, 因此 base class 可以辛苦點沒關係, 但是絕不能讓用你 code 的人得做苦工...
好了, 我實做出來的版本, code 如下:
7 public class GenericSingletonBase<T>
8 where T: GenericSingletonBase<T>,
9 new()
10 {
11 public readonly static T Instance = new T();
12 }
沒看錯, 就是只有這幾行... 接下來貼的 code 是, 如果我自己要實作 singleton pattern 的 class 時, 該如何來用這個 lib:
14 public class GenericSingletonImpl1
15 : GenericSingletonBase<GenericSingletonImpl1>
16 {
17 public GenericSingletonImpl1()
18 : base()
19 {
20 Console.WriteLine("GenericSingletonImpl1.ctor()");
21 }
22 }
扣掉非必要的 constructor, 其實 class 繼承的部份寫完, 就沒有其它必要的 code 了, 很好, 又滿足了我一個要求...
再來就剩最後一個, 要用這個 class 的 code 會不會像上一篇的例子一樣醜? 每次都要自己 casting ? 再看一下 code ...
21 GenericSingletonImpl1 o1 = GenericSingletonImpl1.Instance;
22 GenericSingletonImpl1 o2 = GenericSingletonImpl1.Instance;
23 GenericSingletonImpl1 o3 = GenericSingletonImpl1.Instance;
很好, 收工... 哈哈... 謝謝大家的收看 [:D]