C#面向對象設計模式縱橫談二之Singleton單件(建立型模式)

模式分類多線程

從目的來看:函數

1)建立型(Creational)模式;負責對象建立spa

2)結構型(Structural)模式;處理類與對象間的組合線程

3)行爲型(Behavioral)模式;類與對象交互中的職責分配設計

從範圍來看:code

1)類模式處理類與子類的靜態關係對象

2)對象模式處理對象間的動態關係blog

 

動機(Motivation)接口

在軟件系統中,常常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。get

如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例?

 

這應該是類設計者的責任,而不是使用者的責任。

 

意圖(Intent)

保證一個類僅有一個實例,並提供一個該實例的全局訪問點。

 

單線程單件模式代碼示例

///   <summary>
    
///  單線程單例模式示例
    
///   </summary>
     public  class Singleton
    {
         ///   <summary>
        
///  靜態的對象實例
        
///   </summary>
         private  static Singleton instance;
        
         ///   <summary>
        
///  私有的構造函數
        
///   </summary>
         private Singleton()
        {
        
        }
        
         ///   <summary>
        
///  獲取對象實例的惟一入口
        
///   </summary>
         public  static Singleton GetInstance            
        {
             get
            {
                 if( null == instance)
                    instance =  new Singleton();
                
                 return instance;
            }
        }
    }

 

單線程Singleton模式的幾個要點

1)Singleton模式中的實例構造器能夠設置爲Protected以容許子類派生。

2)Singleton模式通常不要支持ICloneable接口,由於這可能會致使多個對象實例,與Singleton模式的初衷違背。

3)Singleton模式通常不支持序列化,由於這也有可能致使多個對象實例,一樣與Singleton模式的初衷違背。

4)Singleton模式只考慮到了對象建立的管理,沒有考慮對象銷燬的管理。就支持垃圾回收的平臺和對象的開銷來說,咱們通常沒有必要對其銷燬進行特殊的管理。

5)不能就對多線程環境:在多線程環境下,使用Singleton模式依然有可能獲得Singleton類的多個實例對象。

 

///   <summary>
    
///  多線程餓漢式單例模式示例
    
///   </summary>
     public  class Singleton
    {
         ///   <summary>
        
///  靜態的對象實例,在類聲明時就對該對象進行實例化
        
///   </summary>
         private  static  readonly Singleton instance =  new Singleton();
        
         ///   <summary>
        
///  私有的構造函數
        
///   </summary>
         private Singleton()
        {
        
        }
        
         ///   <summary>
        
///  獲取對象實例的惟一入口
        
///   </summary>
         public  static Singleton GetInstance            
        {
             get
            {
                 lock(instance)
                {
                     return instance;
                }
            }
        }
    }

 

///   <summary>
    
///  多線程懶漢式單例模式示例
    
///   </summary>
     public  class Singleton
    {
         ///   <summary>
        
///  靜態的對象實例
        
///   </summary>
         private  static  volatile Singleton instance;
            
         ///   <summary>
        
///  同步鎖
        
///   </summary>
         private  static  object lockObject =  new  object();
        
         ///   <summary>
        
///  私有的構造函數
        
///   </summary>
         private Singleton()
        {
        
        }
        
         ///   <summary>
        
///  獲取對象實例的惟一入口
        
///   </summary>
         public  static Singleton GetInstance            
        {
             get
            {
                 if( null == instance)
                {
                     lock(instance)
                    {
                         if( null == instance)
                        {
                            instance =  new Singleton();
                        }
                    }
                }
                
                 return instance;
            }
        }
    }

 

///   <summary>
    
///  多線程餓漢式單例模式示例(簡)
    
///   </summary>
     public  class Singleton
    {        
         public  static  readonly Singleton instance =  new Singleton();
        
         private Singleton()
        {
        
        }
    }

 

Singleton模式擴展

1)將一個實例擴展到N個實例,例如對象池的實現。

2)將new構造器的調用轉移到其餘類中,例如多個類協同工做環境中,某個局部環境只須要擁有某個類的一個實例。

3)理解和擴展Singleton模式的核心是「如何控制用戶使用new對一個類的實例構造器的任意調用」。

相關文章
相關標籤/搜索