單例模式(Singleton)

2021-06-12 14:43:55 字數 2372 閱讀 7480

單例模式(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方法負責檢驗並例...