本日速記 – Singleton vs. Static 的優劣

In actionscript, flash, flex   April 10, 2006 - 11:04 am

原文

這真是一篇有趣的文章,關於何時該用 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 時主要的依據,用到現在覺得還挺方便,沒有什麼大問題。

by admin

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

    就儲存資料這個目地來看,它們提供的服務是差不多的,只是實作方式不一樣,但主要差別就在日後改寫的彈性,所以才會被放在一起討論 ^^

留言回應

hidden

您的留言會先經過站長認証後才刊登在網站上。
your comments will be approved by Administrator before appearing on the page.

Trackback this post  |  Subscribe to the comments via RSS Feed

mobile phone