上篇因為貼 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]
聽起來 singleton 跟 generic 好像搭不上邊, 不過搭配 .net framework 2.0 的 generic 機制, 倒是可以讓 singleton 好做很多... 我先簡單寫一下不使用 generic 時的做法...
只有單一 class 要實作 singleton 很簡單, 只要寫這樣的 code 就可以:
7 public class SampleSingletonClass
8 {
9 private static SampleSingletonClass _instance = null;
10 public static SampleSingletonClass Instance
11 {
12 get
13 {
14 if (_instance == null)
15 {
16 _instance = new SampleSingletonClass();
17 }
18
19 return _instance;
20 }
21 }
22
23 private SampleSingletonClass()
24 {
25 //
26 // ToDo: constructor code here.
27 //
28 }
29 }
很標準的 code, 不是嗎? 不過問題來了... 當我有第二個 class 也要套用 singleton patterns 時, 幾乎一樣的 code 就得再抄一次, 只因為 public static XXX Instance; 這個 static property 的型別不一樣, 很討厭...
這堆看起來差不多的 code 想要省掉, 那只好動點手腳, 用繼承的技術解決, 不過問題又來了, 型別的宣告... 就像一堆 Collection 物件一樣, 傳回型別宣告為 object 就好了, 不過這樣的 code 用起來實在麻煩... 寫起來就像這樣:
8 public class SingletonBase
9 {
10 public static SingletonBase Instance(Type seed)
11 {
12 if (_singleton_storage[seed] == null)
13 {
14 _singleton_storage[seed] = Activator.CreateInstance(seed);
15 }
16
17 return _singleton_storage[seed] as SingletonBase;
18 }
19
20 private static Hashtable _singleton_storage = new Hashtable();
21 }
22
23 public class SingletonBaseImpl1 : SingletonBase
24 {
25 public SingletonBaseImpl1()
26 : base()
27 {
28 Console.WriteLine("SingletonBaseImpl1.ctor() called.");
29 }
30 }
31
32 public class SingletonBaseImpl2 : SingletonBase
33 {
34 public SingletonBaseImpl2()
35 : base()
36 {
37 Console.WriteLine("SingletonBaseImpl2.ctor() called.");
38 }
39 }
看來不怎麼漂亮? 不過看在重複的 code 只寫一次就好的份上, 醜一點關起門來就看不到了. 不過這樣就沒事了? 不... 用起來更醜... [:'(]
11 SingletonBase.Instance(typeof(SingletonBaseImpl1));
12 SingletonBase.Instance(typeof(SingletonBaseImpl1));
13 SingletonBase.Instance(typeof(SingletonBaseImpl1));
14
15 SingletonBase.Instance(typeof(SingletonBaseImpl2));
16 SingletonBase.Instance(typeof(SingletonBaseImpl2));
17 SingletonBase.Instance(typeof(SingletonBaseImpl2));
實在無法接受這種 quality 的 "class library" ... 這種 code 看起來一點美感都沒有, 就像文筆不好的人在寫文章一樣...
處女座的個性, 實在不能容忍這種 code 出現在我的 project 裡... 碰到這種問題, 直覺的解決辦法就是:
不過要實作還沒那麼簡單, 試了半天, 總算找出一種看起來最得意的解法... <待續>
最近裝了台 PC, 灌了 MCE 2005 ... 用起來只有一個字... 爽!!!
最近台灣引進了 TiVo 這套系統, 應該不少人聽過吧? PC + TV card + MCE2005 就是像 TiVo 這樣子的東西, 只不過都是 Microsoft 靠一堆軟體弄的... 不用額外買專用的機器, 也不用像 TiVo 要付月租費...
用起來如何? 就是用電腦看電視而以, 我沒有接在電視上, 而是直接用 LCD monitor 看, 爽度差了點, 不過我也習慣了, 我們家都是用 monitor 在看電視... 哈哈. 用 MCE 跟一般 TV card 付的軟體看電視, 差別蠻大的... 我列幾個我覺的特別好用的地方:
其它當然有一堆好處, 我就不提了, 反正我也用不到... 如果以後買了 LCD TV, 我一定要擺台電腦在旁邊.. [:D]
抓幾張畫面...
節目表... 左下角會用PIP方式顯示目前正在播放的節目畫面..
播放畫面, 我錄的 "超人特攻隊" ... 它的操作界面都是特別針對電視能看的清楚的畫面, 還有都是能搭配搖控器操作... keyboard / mouse 不是必需品.
選台時下方會出現的頻道 and 節目資訊..
Orz, 這篇是勸敗文嘛...
期待了半天的G7, 等著把用了多年的G2換掉的新機, 沒想到這麼令人失望...
早就有要換掉G2的打算了, 不過一直找不到合適的機種, G2其實我用的很滿意, 只是有些地方還是可以改進改進...
不過想要保留的優點有:
之前認真的考慮過 Canon S3 IS, 不過缺了 (1), 其它都還可以接受, 就這樣龜下來了, 想說還是等 G 系列的出來再說吧, 沒想到這次 G7 改了一堆, 跟本不像 G 系列了...
缺點 (1) 還在, (2) (3) 沒了, 而優點 (2) (3) (4) (5) 全沒了, 額外多的好處都是對我不大重要的...
看了真是 Orz, 看來我要換的話, 目前最合適的機種還是 Canon PowerShot S3 IS 吧... G7 就不考慮了, G8 ? 看看我撐不撐的到 G8 現身.. 哈哈.. 反正這篇沒啥目的, 純脆發發牢騷用的, 我都是隨時鎖定要買的東西, 不過啥時買? 就看啥時有敗家的衝動了...
看起來真不錯啊, 感謝小熊子提供情報, 這樣用起來真舒服...
像 e-mail 一樣, 打完之後直接傳到網站上... Web based HTML editor 做的再好, 就是不如一個簡單的 editor ap 方便..
補張圖爽一下... [H]