本日速記 - Singleton vs. Static 的優劣
這真是一篇有趣的文章,關於何時該用 singleton 與 static 的問題我也已經想很久。
早期我習慣用 Static class 做為中央儲存地(dump site ?),例如把utility methods, prop, constant 都塞在裏面,這樣方便存取。
但在 flex 2 早期的幾個版本裏,static class無法透過 binding 整合到 view去,再加上 Cairngorm 2 出來後 ModelLocator 一律採用 singleton設計,那時究其原因也是為了解決 static prop/method 無法 binding 的問題。
正當我們想全面轉換成 singleton時,flex 2 beta 2 出來了,adobe 很勤快的解決了 static prop binding issue,所以之前的老方法又可以繼續使用。
這下子就陷入兩難,需要在兩者間做點選擇:到底該繼續用 static class就好?或是follow Cairngorm 的 singleton ? 當然後來我們已經有了答案,但先來看看這篇文章講了什麼。
這篇文章的基本要意就是: singleton 的彈性比較大,在可能的情況下應該儘量用 singleton而非 static.
主要的 rationale 如下:
1、singleton 的彈性來自於它可兼俱 Factory 的性質,例如 getInstance()也可視為一個 factory method 動態的產生物件(甚至是傳回一個 Abstract Factory),然後透過『多型』就可以輕鬆的置換許多 method 的功能,彈性與威力無窮。
2、singleton class 可以 extends 與 implement 其它class,但 static class 不行。
3、singleton 是 statefull,如果需要維持 state,用 singleton會比較方便。
另外,文章中也說明了選擇時的判斷條件:
1、如果是靜態不會改變的東西,例如 String utility (parse, sprintf…) 就很適合放在 static class裏,而此時它的用途就跟以前的 _global 沒太大差別,這也是colin moock 在 EAS2 中建議的方法。
2、如果是未來可能會改變的東西,放 singleton class會比較好,因為統一透過 getInstance()取得 reference後的操作行為都是一樣的,因此將來business logic 要改只要在 getInstance()動手腳傳回相容的介面即可。
這兩點也是我們後來選擇 singleton 時主要的依據,用到現在覺得還挺方便,沒有什麼大問題。


2 Comments Add your own
1. b6s&hellip | April 10th, 2006 at 7:46 pm
唔,Singleton 的是 “object,” 而 static 的是 “method,” 照理說應該是完全不同世界的。
2. jeremy&hellip | April 11th, 2006 at 12:07 am
就儲存資料這個目地來看,它們提供的服務是差不多的,只是實作方式不一樣,但主要差別就在日後改寫的彈性,所以才會被放在一起討論 ^^
Trackback this post | Subscribe to the comments via RSS Feed