一、模式定義
保證一個類僅有一個執行個體,並提供一個訪問它的全域訪問點。
二、所體現出的設計原則
這裡重新歸納一下軟體設計中的幾個原則:
1.OCP法則:開閉法則(Open-Closed Principle)一個軟體系統應當對擴充開放,對修改關閉。
描述:通過擴充已有軟體系統,可以提供新的行為,以滿足對軟體的新的需求,使變化中的軟體有一定的適應性和靈活性。同時已有軟體模組,特別是最重要的抽象層模組不能再修改,這使變化中的軟體系統有一定的穩定性和延續性。
實現原則:把抽象介面和實現分離。
2.LSP法則: Liskov Substitution Principle(裡氏代換原則)
描述:這是繼承的特徵,子類型(subtype)必須能夠替換它們的基底類型。
3.DIP法則: 依賴倒置(Dependence Inversion Principle)
表述:抽象不應當依賴於細節;細節應當依賴於抽象;要針對介面編程,不針對實現編程。具體講就是 要依賴於抽象,不要依賴於具體。
實現原則:傳遞參數時,或者在組合彙總關係中,盡量引用層次高的類。
4.ISP原則:介面隔離原則(Interface Segregation Principle)
描述:每一個介面應該是一種角色,不多不少,不幹不該乾的事,該乾的事都要幹。這類似編碼原則中的最小許可權法則。
5.CARP法則: 合成/彙總複用原則(Composite/Aggregate Reuse Principle或CARP)也叫做合成複用(CRP)原則(Composite Reuse Principle
描述:要盡量使用合成/彙總,盡量不要使用繼承。這就是has a和is a的的問題
6. 迪米特法則(LoD)迪米特法則(Law of Demeter或簡寫LoD)又叫最少知識原則(Least Knowledge Principle或簡寫為LKP)
描述:一個對象應當對其它對象有儘可能少的瞭解。其它表述:這實際上就是設計高內聚低耦合的要求,有人形象地稱謂“不要和陌生人講話”。
似乎找不到單件模式符合的哪一項,>_<
三、UML圖示
簡單反而畫不出來了。。。
四、應用情境
單件模式常用來代表系統中的某種唯一的資源,比如說檔案系統,資源管理員等等。
五、注意事項
單件模式有幾種實現,比如說:直接將本對象的引用定義成static final類型,然後在全域唯一提供者中返回此引用。
private static final MySingleton _instance = new MySingleton();
public MySingleton getinstance() {
return _instance;
}
這種寫法簡單易記,並且沒有安全執行緒的問題。但缺點是不能繼承。
還有一種做法可以滿足繼承的需要:全域統一提供者仍在父類中定義,同時父類中維護一張映射表,key為子類名稱,value為子類執行個體的引用。
但我覺得單件模式還是不要繼承的好,繼承單例總感覺不對勁。
六、舉例說明
比如說做一個FTP工具,需要設計一個FTP Session的管理者對象,來實現諸如FTP Session的建立,銷毀,儲存等等。此時這個管理者對象就是全域唯一的訪問FTP Session的點,所以設計成單件模式就比較適合了。
七、程式碼範例
維基百科:http://zh.wikipedia.org/wiki/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F