Q: 在很多地方我都看到使用了Singleton類。我的問題是:較之一個包含static方法(methds)的類,使用Singleton具有什么優(yōu)點呢? A: 不使用包含static方法的類而使用Singleton,其區(qū)別在于,后者可以帶來有效的面向對象設計。Singleton通常展示的是一種更清晰的方法。而一個包含static方法的類只不過是函數(shù)或公用子程序(utilities)的簡單羅列。 你會問,羅列一組函數(shù)有什么問題? 很簡單。羅列函數(shù),你就不是在進行面向對象編程;你的工作實際上倒退到了傳統(tǒng)的面向過程的程序設計中。悄然之間,對象不再是程序的焦點,而你自己也陷入到以數(shù)據(jù)為中心的程序設計模式中。換句話說,你不再是向包裝了狀態(tài)和行為的對象發(fā)送消息,而是針對數(shù)據(jù)進行函數(shù)調用。公用子程序必然造成行為和數(shù)據(jù)完全分離,而這一點在面向對象設計中是絕不允許的。 也不是說完全不能使用公用子程序。面向對象的公用子程序確實存在。有時也需要將對象當作數(shù)據(jù)來處理。例如,我曾寫了一套公共子程序,用來將Java對象轉換成相應的CORBA形式。很難將那些方法寫成一個類,因為它們確實沒有狀態(tài)信息;我也不想將轉換代碼嵌入到Java類中。然而,這確實容易帶來混亂。 對于系統(tǒng)中的某個類,如果想讓它無論什么時候只有一個實例存在,這種情況下可以使用Singleton。例如有這樣一個類,它提供對CORBA server的訪問,還要做到負載平衡。這時候就不要使用多個這樣的對象,因為每個對象都會和相同的server打交道。占用冗余資源當然浪費。所以,對server的訪問最好集中到一個實例之中。 |
|