程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 設計模式之一(單例模式)

設計模式之一(單例模式)

編輯:C#入門知識

單例模式(Singleton),保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化多個對象。一個最好的辦法就是,讓類自身負責保存它的唯一實例。這個類可以保證沒有其他實例可以被創建,並且它可以提供一個訪問該實例的方法。

          SyncRoot =  ();          
         
             (instance ==  (SyncRoot)   
            ///若實例不存在,則new一個新實例,否則返回已有的實例      
(instance == =

說明:

構造方法private Singleton(){},讓其private,這樣就堵死了外界利用new創建此類實例的可能

public static Singleton GetInstance() 此方法是獲得本類實例的唯一全局訪問點

lock:是確保當一個線程位於代碼的臨界區時,另一個線程不進入臨界區。如果其他線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。

然後在上面的Singleton類中添加一個測試方法

        
         

最後即可在控制台應用程序的入口函數進行調用測試

      Main(

結果也Ok

            Singleton s1 == (s1 ==

繼續在Main函數中添加實例代碼,判斷兩個實例化對象是否為一個對象。

 

 其實咋實際應用當中,C#與公共語言運行庫也提供了一種“靜態初始化”方法,這種方法不需要開發人員顯示的編寫線程安全代碼,即可解決多線程環境下它是不安全的問題。

         Singletons instance =  Singletons();   
         

通過sealed修飾符來修飾類,是阻止發生派生,而派生可能會增加實例

在第一次引用類的任何成員時創建實例。公共語言運行庫負責處理變量初始化。並通過readonly標記instance變量,這意味著只能在靜態初始化期間或在類構造函數中分配變量。由於這種靜態初始化的方式是在自己被加載時就將自己實例化,所以被形象的稱之為餓漢式單例類,上面的單例模式處理方式是要在第一次被引用時,才會將自己實例化,所以就被成為懶漢式單例類。

 餓漢式,即靜態初始化的方式,它是類一加載就實例化對象,所以要提前占用系統資源。然後懶漢式,又會面臨著多線程訪問的安全性問題,需要做雙重鎖定這樣的處理才可以保證安全。送一到底使用哪一種方式,取決於實際的需求。從C#語言的角度來講,餓漢式的單例類已經足夠滿足我們的需求了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved