1.前言
很多時候,我們需要為某個型別建立獨一無二的物件。比如系統配置檔案、工具類、執行緒池、快取、系統日誌等,此時單例模式應運而生。
單例模式: 確保乙個類只有乙個例項,並提供乙個全域性訪問點
舉例1
1從輸出結果可知,兩次例項化得到的是同乙個物件。using
system;
2using
system.collections.generic;
3using
system.text;45
namespace
單例模式618
19console.read();20}
21}2223
public
class
singleton
2427
public
static
singleton getinstance()
2831
}32 }
2.單例模式的特點
單從實現來看,單例模式有以下特點
單例模式uml類圖如下
3.懶漢模式
如果在多執行緒下,能不能保證getinstance()方法只建立乙個例項呢?很顯然是不行的。在c#中可以使用lock語句來保證對臨界區進行完全訪問(所謂的臨界區是指在多執行緒訪問共享資源時,使用獨佔式訪問的**段來對共享資源實施保護的一種手段)。接下來我們看看多執行緒下的單例模式
3.1舉例2(多執行緒時的單例)
1這個例子能不能保證多執行緒安全呢?能。最先進入的那個執行緒會建立物件例項,保證類只例項化一次。但這樣每次都lock的話,一旦多次呼叫時,第乙個呼叫的會進入lock,而其他的執行緒則需要等待第乙個結束才能依次呼叫,後面的依次呼叫,等待......所以會導致效能損耗。lock加鎖就好比漏斗一樣,每次只能樣乙個執行緒通過namespace
單例模式214
15console.read();16}
17}1819
public
class
singleton
2026
27public
static
singleton getinstance()
2835}36
return
instance;37}
38}39 }
3.2舉例3(多執行緒下多重鎖定的單例)
為了解決例子2中的多次鎖定問題,我們進行稍微的改動,同時解決了執行緒安全和效能的問題。(若沒有效能方面的顧慮,這個方法就是殺雞用了牛刀)
14.餓漢模式namespace
單例模式214
15console.read();16}
17}1819
public
class
singleton
2026
27public
static
singleton getinstance()
2837}38
}39return
instance;40}
41}42 }
15.餓漢模式 vs 懶漢模式餓漢模式:即利用靜態初始化的方式,類一旦載入就立即例項化。其特點是載入類時比較慢,但執行時比較快,並且執行緒安全。namespace
單例模式214
15console.read();16}
17}1819
public
sealed
class
singleton
2025
26public
static
singleton getinstance()
2730
}31 }
今天是堅持晨讀的第21天,也把這段時間的知識作下總結,寫得不好的地方,歡迎討論指出。
設計模式 單例模式
單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...