設計模式 c 單例模式

2021-09-23 08:09:01 字數 2895 閱讀 5704

單例模式

單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到 餓漢式 和 懶漢式 這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。

一、簡介

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。

許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。

二、基本的實現思路

單例模式要求類能夠有返回物件乙個引用(永遠是同乙個)和乙個獲得該例項的方法(必須是靜態方法,通常使用initance這個名稱)。

單例的實現主要是通過以下兩個步驟:

將該類的構造方法定義為私有方法,這樣其他處的**就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項;

在該類內提供乙個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用。

三、注意事項

單例模式在多執行緒的應用場合下必須小心使用。如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從而同時各自建立了乙個例項,這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。 解決這個問題的辦法是為指示類是否已經例項化的變數提供乙個互斥鎖(雖然這樣會降低效率)。

單例模式的五種寫法:

1、餓漢式(靜態常量)

class singleton

;singleton* singleton:

:p = new singleton()

;singleton* singleton:

:initance()

優點:這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。

缺點:在類裝載的時候就完成例項化。如果從始至終從未使用過這個例項,則會造成記憶體的浪費

2、懶漢式(執行緒不安全)[不可用]

class singleton

;singleton* singleton:

:p = nullptr;

singleton* singleton:

:initance()

缺點:對於高併發的系統來說,當乙個執行緒建立乙個例項時,另乙個系統也在建立例項,這會造成例項被修改造成很大的麻煩。

3、懶漢式(執行緒安全,同步方法)[不推薦用]

class singleton

;singleton* singleton:

:p = nullptr;

mutex singleton:

:mu;

singleton* singleton:

:initance()

優點:解決了執行緒不安全的問題,當初始化乙個單例模式時,物件p的讀,寫只能允許乙個執行緒操作。

缺點:對於乙個高併發的系統而言,當p已經初始化,每個執行緒還要乙個乙個的進行initance(),導致讀寫的效率太低。

4、懶漢式雙重檢查[不可用]

class singleton

;singleton* singleton:

:p = nullptr;

mutex singleton:

:mu;

singleton* singleton:

:initance()

return p;

}

優點:當呼叫initance()時,先對例項p進行非空的判斷,解決了方法三在高併發時效率低的問題,之後在p的例項化之前進行加鎖,再進行非空的判斷,防止多個執行緒同時例項化。

缺點:看上去這個方法是可行的,但是他的缺點是無法通用,對不同的編譯器而言,記憶體讀寫會出現reorder的情況,當進行p = new singleton()時,有的先分配記憶體,然後呼叫建構函式singleton(),在將位址賦值給指標p;而有的編譯器會先分配記憶體,然後將位址賦值給指標p,再呼叫建構函式。這個時候指標p雖然不為null,但是返回的p所指向的記憶體資料是不對的。

4、懶漢式雙重檢查[推薦使用]【volatile】

class singleton

;singleton*

volatile singleton:

:p = nullptr;

mutex singleton:

:mu;

singleton* singleton:

:initance()

return p;

}

優點:使用volatile關鍵字對指標p宣告,這樣編譯器在執行時就不會對該變數進行優化,也就不會出現4的問題

設計模式 C 設計模式 單例模式

設計模式 物件導向設計七大原則 設計模式 設計模式概念和分類 設計模式 c 設計模式 單例模式 設計模式 c 設計模式 工廠方法模式 設計模式 c 設計模式 抽象工廠模式 設計模式 c 設計模式 建造者模式 設計模式 c 設計模式 原型模式 作者自用的泛型單例模組 單例模式 singleton pa...

C 設計模式 (單例模式)

單例模式 顧名思義,只有乙個物件例項,即保證乙個類只有乙個物件可以使用。作用類似於乙個全域性變數,可以任意呼叫,但是比全域性變數更容易管理,使用。單例模式也有很多種實現方式 第一種實現方法 h檔案 class csock test public casyncsocket cpp檔案 csock te...

設計模式 單例模式(c )

在gof 設計模式 中,單例模式的定義為 保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。下面是單例模式的c 實現 方案一 建構函式和拷貝建構函式一定要宣告為private 定義static成員 單例指標和獲取單例指標的函式 static單例指標要在類外定義並初始化 實現獲取單例指標的函式時...