C#面向对象设计模式纵横谈——Singleton单件(创建型模式)
Singleton單件(創建型模式)
動機(Motivation)
在軟件系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。
如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例?
這應該是類設計者的責任,而不是使用者的責任。
意圖(Intent)
保證一個類僅有一個實例,并提供一個該實例的全局訪問點。
結構(Structure)
?
單線程Singleton 模式實現
????{
????????private?static?Singleton?instance;
????????private?Singleton()?{?}
????????public?static?Singleton?Instance
????????{
????????????get
????????????{
????????????????if?(instance?==?null)
????????????????{
????????????????????instance?=?new?Singleton();
????????????????}
????????????????return?instance;
????????????}
????????}
????}
????class?Test
????{
????????public?static?void?Main()
????????{
????????????Singleton?s?=?Singleton.Instance;
????????}
????}
單線程Singleton模式的幾個要點
Singleton模式中的實例構造器可以設置為protected以允許子類派生。
Singleton模式一般不要支持ICloneable接口,因為這可能會導致多個對象實例,與Singleton模式的初衷違背。
Singleton模式一般不要支持序列化,因為這也有可能導致多個對象實例,同樣與Singleton模式的初衷違背。
Singletom模式只考慮到了對象創建的管理,沒有考慮對象銷毀的管理。就支持垃圾回收的平臺和對象的開銷來講,我們一般沒有必要對其銷毀進行特殊的管理。
不能應對多線程環境:在多線程環境下,使用Singleton模式仍然有可能得到Singleton類的多個實例對象。
多線程Singleton 模式實現
????{
????????private?static?volatile?Singleton2?instance?=?null;
????????private?static?object?lockhelper?=?new?object();
????????private?Singleton2()?{?}
????????public?static?Singleton2?Instance
????????{
????????????get
????????????{
????????????????if?(instance?==?null)
????????????????{
????????????????????lock?(lockhelper)
????????????????????{
????????????????????????if?(instance?==?null)
????????????????????????{
????????????????????????????instance?=?new?Singleton2();
????????????????????????}
????????????????????}
????????????????}
????????????????return?instance;
????????????}
????????}
????}
使用.NET類型初始化機制實現多線程Singleton 模式
????{
????????public?static?readonly?Singleton3?Instance?=?new?Singleton3();
????????private?Singleton3()?{?}
????}
????class?Singleton3_1
????{
????????public?static?readonly?Singleton3_1?Instance?=?new?Singleton3_1();
????????private?Singleton3_1()?{?}
????????static?Singleton3_1()
????????{
????????????Instance?=?new?Singleton3_1();
????????}
????}
Singleton模式擴展
將一個實例擴展到n個實例,例如對象池的實現。
將new 構造器的調用轉移到其他類中,例如多個類協同工作環境中,某個局部環境只需要擁有某個類的一個實例。
理解和擴展Singleton模式的核心是“如何控制用戶使用new對一個類的實例構造器的任意調用”。
推薦參考書
? 《設計模式:可復用面向對象軟件的基礎》GoF
? 《面向對象分析與設計》Grady Booch
? 《敏捷軟件開發:原則、模式與實踐》Robert C. Martin
? 《重構:改善既有代碼的設計》Martin Fowler
? 《Refactoringto Patterns 》JoshuaKerievsky
轉載于:https://www.cnblogs.com/shanvenleo/archive/2006/02/14/330730.html
總結
以上是生活随笔為你收集整理的C#面向对象设计模式纵横谈——Singleton单件(创建型模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看你知道不知道之-制作数据字典
- 下一篇: 在C#中利用SharpZipLib进行文