大化設計模式 單例模式

2021-10-08 03:54:27 字數 3373 閱讀 1763

3.3 靜態初始化

4.拓展

說到單例模式想必大家都不陌生,為了加深自己對單例模式的理解,我又對單例模式進行了複習.(本節部分內容節選自大話設計模式第21章)

即保證乙個類僅有乙個例項,並提供有乙個訪問它的全域性訪問點.

通常我們可以讓乙個全域性變數是的乙個物件被訪問,但它不能防止你例項化多個物件.此時乙個最好的辦法就是:讓類自身負責儲存它的唯一例項.這個類可以保證沒有其他例項可以被建立,並且他可以提供乙個訪問該例項的方法.

先上乙個較為普遍的寫法(沒錯!他有很多寫法,但萬變不離其宗)

class

singleton

public

static

singleton

getinstace()

//獲取本類例項的唯一全域性訪問點

return instace;

}}

呼叫方式:

singleton.

getinstace()

;

這裡就不做過多解釋了.

當多執行緒程式中,多個執行緒同時訪問singleton類,呼叫getinstance()方法,就會有可能建立出多個例項

這時候我們就需要lock關鍵字了.

lock是確保當乙個執行緒位於**的臨界區時,另乙個執行緒不進入臨界區.如果其他執行緒試圖進入鎖定的**,則它將已知等待(即被阻止),知道該物件被釋放.

結合下面**,你會有乙個更直觀的感受.

class

singleton

private

static

readonly

object syncroot =

newobject()

;//程式執行時建立乙個 靜態 唯讀 的 程序輔助物件

public

static

singleton

getinstace()

}return instace;

}}

這段**使得物件例項由最先進入的那個執行緒建立,以後的執行緒在進入時不會再去建立物件例項了.由於有了lock,就保證了多執行緒環境下的同時訪問也不會造成多個例項的生成.

但當你仔細觀察,你就會發現另乙個問題,每次getinstance()時,都需要lock,是會影響效能的吧.所以就有了雙重鎖定

class

singleton

private

static

readonly

object syncroot =

newobject()

;public

static

singleton

getinstace()

}}return instace;

}}

細心的你可能已經發現了就多了一行**.

可能你又會有疑問了:為什麼在外面判斷了instance是否存在,再加鎖之後還要判斷一次呢?

我們來一步一步分析

當第乙個inatance不為空的時候,皆大歡喜 ,直接return當第乙個inatance為空的時候,同時又有兩個程序來呼叫getinstance()的時候,lock開始真正起作用,先進來的程序,會new一次物件,當第乙個程序結束,出去後,第二個程序繼續進入,如果此時沒有第二個"instance==null"的判斷,第二個程序還是依然會繼續new一次.並沒有達到單例的目的了呀.

你品,你細品,是不是這個理?

c#與公共語言庫也提供了一種靜態初始化方法,這種方法不需要開發人員顯式的編寫執行緒安全**,就可也解決多執行緒環境下它是不安全的問題.

//sealed 關鍵字修飾類,叫做密封類   這裡防止發生派生類,因為派生類可能會發生例項

public

sealed

class

singleton

public

static

singleton

getinstace()

}

當寫到這裡的時候是不是有些小夥伴就會有這樣的疑問了?(不!我沒有!!你不要強行安排我!!!)

這怎麼和實用類的靜態方法類似?比如你看看.net的math類,是不是很像???

同:實用類通常也會採取私有化建構函式來防止起有例項

異:1.實用類不儲存狀態,僅會提供一些靜態方法和變數給你使用,但是單例類是會有狀態的.

2.實用類不能用於繼承多型,而雖然單例類雖然唯一,但卻可以有子類來繼承.

3.實用類只不過是一些方法屬性的集合,而單例卻是有唯一的物件例項.

1.保證唯一的例項化

2.單例模式因為singleton類封裝他的唯一例項,這樣它可以嚴格控制客戶怎樣訪問和何時訪問.簡單來說就是對唯一例項的受控訪問.

由於unity是主要是單執行緒的,所以通常對多執行緒並不關注.但並非是不用lock,是用的比較少.

關於unity的多執行緒可以參考這篇文章,如果對unity多執行緒感興趣的話可以抽時間詳細去了解一下.

**懶漢:**在第一次引用就將自己例項化,被稱為懶漢式單例.例如普遍寫法那個模組的實現方式就是.

**餓漢:**當自己被載入時就將自己例項化,被稱為餓漢式單例.例如靜態初始化那個模組的實現方式就是.

差異:

餓漢式:是一種靜態初始化的方式,他是類一載入就例項化物件,所以要提前占用系統資源.

懶漢式:會面臨著多執行緒訪問的安全性問題,需要做雙重鎖定這樣的處理才能保證安全.

這種事情是根據實際需求而改變的.

對於unity開發者,如果不在多執行緒裡使用的話,其實兩者都可以,最好還是用懶漢模式,畢竟餓漢模式會提前占用記憶體

優先考慮執行緒安全問題的話,那就用餓漢模式好了.

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...