設計模式 單例模式

2022-01-26 14:17:11 字數 2285 閱讀 4586

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

namespace

單例模式214

15console.read();16}

17}1819

public

class

singleton

2026

27public

static

singleton getinstance()

2835}36

return

instance;37}

38}39 }

這個例子能不能保證多執行緒安全呢?能。最先進入的那個執行緒會建立物件例項,保證類只例項化一次。但這樣每次都lock的話,一旦多次呼叫時,第乙個呼叫的會進入lock,而其他的執行緒則需要等待第乙個結束才能依次呼叫,後面的依次呼叫,等待......所以會導致效能損耗。lock加鎖就好比漏斗一樣,每次只能樣乙個執行緒通過

3.2舉例3(多執行緒下多重鎖定的單例)

為了解決例子2中的多次鎖定問題,我們進行稍微的改動,同時解決了執行緒安全和效能的問題。(若沒有效能方面的顧慮,這個方法就是殺雞用了牛刀)

1

namespace

單例模式214

15console.read();16}

17}1819

public

class

singleton

2026

27public

static

singleton getinstance()

2837}38

}39return

instance;40}

41}42 }

4.餓漢模式

1

namespace

單例模式214

15console.read();16}

17}1819

public

sealed

class

singleton

2025

26public

static

singleton getinstance()

2730

}31 }

5.餓漢模式 vs 懶漢模式餓漢模式:即利用靜態初始化的方式,類一旦載入就立即例項化。其特點是載入類時比較慢,但執行時比較快,並且執行緒安全。

今天是堅持晨讀的第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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...