單件模式 Singleton Pattern

2022-01-17 02:31:19 字數 2560 閱讀 5162

單例模式的特點:

單例模式應用:

singleton模式包含的角色只有乙個,就是singleton。singleton擁有乙個私有建構函式,確保使用者無法通過new直接例項 它。除此之外,該模式中包含乙個靜態私有成員變數instance與靜態公有方法instance()。instance方法負責檢驗並例項化自己,然後 儲存在靜態成員變數中,以確保只有乙個例項被建立。(關於執行緒問題以及c#所特有的singleton將在後面詳細論述)。

該程式演示了singleton的結構,本身不具有任何實際價值。1//

singleton pattern -- structural example  

2using

system;34

//"singleton"

5class

singleton612

13//

methods

14public

static

singleton instance()

1522}23

24/**/

///25

///client test

26///

27public

class

client

2838

}使用singleton模式有乙個必要條件:在乙個系統要求乙個類只有乙個例項時才應當使用單例模式。反過來,如果乙個類可以有幾個例項共存,就不要使用單例模式。

注意:不要使用單例模式訪問全域性變數。這違背了單例模式的用意,最好放到對應類的靜態成員中。

不要將資料庫連線做成單例,因為乙個系統可能會與資料庫有多個連線,並且在有連線池的情況下,應當盡可能及時釋放連線。singleton模式由於使用靜態成員儲存類例項,所以可能會造成資源無法及時釋放,帶來問題。

下面這段singleton**演示了負載均衡物件。在負載均衡模型中,有多台伺服器可提供服務,任務分配器隨機挑選一台伺服器提供服務,以確保任務均衡(實際情況比這個複雜的多)。這裡,任務分配例項只能有乙個,負責挑選伺服器並分配任務。

**1//singleton pattern -- real world example  23

using

system;

4using

system.collections;

5using

system.threading;67

//"singleton"

8class

loadbalancer925

26//

methods

27public

static

loadbalancer getloadbalancer()

2843

return

balancer;44}

4546

//properties

47public

string

server

4855}56

}5758/**/

///59

///60

///61

///62

public

class

6381

}c#的獨特語言特性決定了c#擁有實現singleton模式的獨特方法。這裡不再贅述原因,給出幾個結果:

方法一:

下面是利用.net framework平台優勢實現singleton模式的**:

1sealed

class

singleton

2這使得**減少了許多,同時也解決了執行緒問題帶來的效能上損失。那麼它又是怎樣工作的呢?

注意到,singleton類被宣告為sealed,以此保證它自己不會被繼承,其次沒有了instance的方法,將原來_instance成員 變數變成public readonly,並在宣告時被初始化。通過這些改變,我們確實得到了singleton的模式,原因是在jit的處理過程中,如果類中的static屬 性被任何方法使用時,.net framework將對這個屬性進行初始化,於是在初始化instance屬性的同時singleton類例項得以建立和裝載。而私有的建構函式和 readonly(唯讀)保證了singleton不會被再次例項化,這正是singleton設計模式的意圖。

不過這也帶來了一些問題,比如無法繼承,例項在程式一執行就被初始化,無法實現延遲初始化等。

詳細情況可以參考微軟msdn文章:《exploring the singleton design pattern》

方法二:

既然方法一存在問題,我們還有其它辦法。

**1public

sealed

class

singleton26

7public

static

singleton getinstance()811

12class

nested

1319

20internal

static

readonly

singleton instance 

=new

singleton();21}

22}

單件模式(單例模式)

readme 0.1 本文部分描述 head first 設計模式 旨在學習 單件模式 單例模式 的相關知識 及其應用 單件模式 1.0 單件模式的應用背景 有一些物件其實我們只需要乙個,比方說 執行緒池,快取,對話方塊,登錄檔等的物件,這都可以通過單件模式來解決 1.1 定義 確保乙個類只有乙個例...

單件模式(單例模式)

1 單件模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。2 經典的單件模式實現 public class singleton public static singleton getinstance return uniqueinstance 問題點 public static singleto...

單例模式(單件模式)

color red size medium 單件模式,就是確保乙個類只有乙個例項,並提供乙個全域性訪問點。size color 單例的作用是獨一無二,比方說,如果有乙個登錄檔設定的物件,你不希望這樣的物件有多個拷貝吧,那會把設定搞得一團亂,利用像單例這樣的單件物件,可以確保程式中使用的全域性資源只有...