單例模式(singleton),保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的辦法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立,並且它可以提供乙個訪問該例項的方法。
單例模式(singleton)uml類圖:
分析:singleton類定義乙個getinstance()操作,允許客戶訪問它的唯一例項。getinstance()是乙個靜態方法,主要負責建立自己的唯一例項。
單例模式(singleton)實現:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace singleton
/*此方法是獲得本類例項的唯一全域性訪問點。*/
public static singleton getinstance()
return instance;}}
}
客戶端:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace singleton
console.read();}}
}
單例模式因為singleton類封裝它的唯一例項,這樣它可以嚴格地控制客戶怎樣訪問它以及何時訪問它。簡單的說就是對唯一例項的受控訪問。
多執行緒時的單例:
多執行緒的程式中,多個執行緒同時訪問singleton類,呼叫getinstance()方法,會有可能造成建立多個例項的。此時,可以給程序一把鎖來處理。lock語句是確保當乙個執行緒位於**的臨界區時,另乙個執行緒不進入臨界區。如果其他執行緒試圖進入鎖定的**,則它將一直等待(即被阻止),知道該物件被釋放。
此時,singleton類**如下(客戶端不變):
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace multhreadsingleton
public static singleton getinstance()
}return instance;}}
}
雙重鎖定:由於在多執行緒單例中,每次呼叫getinstance()方法,都需要lock,會影響效能,採用下列「雙重鎖定」方式。這種方式不用讓執行緒每次都加鎖,而是只在例項未被建立的時候再加鎖處理,同時也能保證多執行緒的安全,也就是因此這種方式被稱為double-check locking(雙重鎖定)。
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace multhreadsingleton
public static singleton getinstance()}}
return instance;}}
}
靜態初始化方法:其實在實際應用中,c#與公共語言執行庫也提供了一種「靜態初始化」的方法,這種方法不需要開發人員顯式的編寫執行緒安全**,即可解決多執行緒環境下它是不安全的問題。
/*sealed 阻止發生派生,而派生可能會增加例項*/
public sealed class singleton
public static singleton getinstance()
}
單例模式總結:單例模式中主要需要解決的是兩個問題:全域性訪問和例項化控制問題。
靜態初始化方式是在自己被載入時就將自己例項化,被形象的稱為餓漢式單例類。這種方式是類一載入就例項化的物件,要提前占用系統資源。
原先的單例模式處理方式第要在第一次被引用時,才會將自己例項化,所以稱為懶漢式單例類。該方式面臨著多執行緒訪問的安全性問題,需要雙重鎖定這樣的處理才能達到保證安全。
Singleton 單例 模式
singleton 模式的宗旨在於確保某個類只有乙個例項,別且為之提供乙個全域性訪問點。為了防止其他工作人員例項化我們的類,可以為該類建立唯一乙個構造器,並將構造器的可見 設定為私有。值得注意的是,如果我們建立了其他的非私有的構造器,或者根本沒有為該類提 供構造器,那麼其他人員還是能例項化我們的類。...
Singleton 單例 模式
今天看了,單例模式。感覺他的本質就是,控制類例項的個數。特例就是,控制static變數的唯一性,保證各個程式共享著同一例項。乙個例子 package singleton description 這是乙個單例模式的使用demo author kyle goal 實現乙個類僅有乙個例項 singleto...
單例(Singleton)模式
單例模式的特點 singleton模式包含的角色只有乙個,那就是singleton。singleton擁有乙個私有建構函式,確保使用者無法通過new取得singleton的例項。除此之外,該模式中包含乙個靜態私有成員變數instance與靜態公有方法instance。instance方法負責檢驗並例...