面向對象編程思想-單例模式
阿新 • • 發佈:2017-05-23
構造 turn 什麽 性能 線程池 線程並發 管理器 成員 man
單例模式的定義:只能有一個實例,提供唯一公開、可訪問實例的全局訪問點
單例模式的三種實現方式:
示例1
private Singleton() { Console.WriteLine("{0}被構造,線程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId); }
private static Singleton m_Singleton = null;public static Singleton CreateInstance() {if (m_Singleton == null) {
//Thread.Sleep(1000); m_Singleton = new Singleton(); } return m_Singleton; }
優點:直到對象要求產生一個實例才執行實例化
缺點:線程不安全,並發執行時,如果尚未創建實例,會創建多個實例
示例2
private Singleton() { Console.WriteLine("{0}被構造,線程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId); } private static readonly Singleton m_Singleton = new Singleton(); public static Singleton CreateInstance() { return m_Singleton; }
優點:線程安全
缺點:靜態初始化由CLR執行,缺少實例化機制的控制權 。在程序啟動或第一次訪問引用了類的任何成員時實例已經被創建。
示例3
private Singleton() { Console.WriteLine("{0}被構造,線程ID={1}", this.GetType().Name, Thread.CurrentThread.ManagedThreadId); } private static Singleton m_Singleton = null; private static readonly object m_Object = new object(); public static Singleton CreateInstance() {
//提高系統性能。鎖會阻塞線程,對象被實例化後不再需要線程排隊等待 if (m_Singleton == null) {
//保證鎖住部分只有一個線程執行 lock (m_Object) {
//確保單線程時 對象只被創建一次 if (m_Singleton == null) { m_Singleton = new Singleton(); } } } return m_Singleton; }
優點:解決線程並發問題,將實例化延遲到第一次訪問對象時發生
使用場景:系統的任務管理器,配置文件的讀取,數據庫連接池的設計,多線程的線程池設計,應用程序的日誌應用等。
說到這裏有人會問:
1.有了靜態類,為什麽還要有“單例”?
靜態類是一種語法,而單例模式是一種思想。
靜態類不可以繼承類或實現接口。
靜態類中不能聲明實例成員。即靜態類中所有的字段,屬性,方法等都必須是靜態的。
無法控制靜態成員的初始化。
設計模式是前人不斷嘗試、改進後提煉出來的思想。但我們不要生搬硬套,適合的才是最好的。在此,關於單例模式的學習到此結束。謝謝您的閱讀
由於博主能力有限,文中可能存在不正確的地方,歡迎斧正,補充。
面向對象編程思想-單例模式