C 特殊類設計1 單例模式

2021-10-07 03:45:28 字數 3026 閱讀 9104

乙個類只能建立乙個物件,即單例模式,該模式可以保證系統中該類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。單例模式有兩種實現模式:飽漢,餓漢

餓漢模式就是說不管你將來用不用,程式啟動時就建立乙個唯一的例項物件。

思路:簡單來說,就是將類的建構函式,拷貝建構函式,賦值運算子過載私有,隨後定義乙個靜態的類物件,再給出乙個靜態的類物件的獲取方法。

class

singleton

private

:// 建構函式私有

singleton()

// c++98 防拷貝

singleton

(singleton const&)

; singleton&

operator

=(singleton const&)

;static singleton m_instance;};

singleton singleton::m_instance;

//餓漢模式

void

main()

餓漢模式優點:簡單。 但由於只要程式啟動,就會初始化類物件,比較耗資源,非執行緒安全。

思路:簡單來說,就是將類的建構函式,拷貝建構函式,賦值運算子過載私有,和餓漢區別在於,隨後定義的是乙個靜態的類物件指標,再給出乙個靜態的類物件的獲取方法,這樣保證了只有在定義乙個類物件的時候才會真正的初始或這個類。

//不是執行緒安全

class

singleton

return _instance;

}protected

:singleton()

private

:singleton()

;// 防拷貝

singleton

(singleton const&)

;singleton&

operator

=(singleton const&)

;static singleton* _instance;};

singleton* singleton::_instance =

nullptr

;void

thread_fun

(int n)

}void

main()

但以上程式在多執行緒情況下是不安全的,要想到到執行緒安全,可以加鎖,同時我們使用雙檢機制提高效率。

雙檢機制意味著當顯出判斷_instance != nullptr)時,說明物件已經被例項,直接返回該物件。

mutex mt;

//不是執行緒安全

class

singleton

mt.unlock()

;}return _instance;

}protected

:singleton()

private

:static singleton* _instance;};

singleton* singleton::_instance =

nullptr

;void

thread_fun

(int n)

}void

main()

但其實我們在實際應用中,並不太會採用以上的做法,我們會定義乙個單例的模板類,隨後用該模板類和我們要建立的類例項化乙個特定的類物件。這個模板類其實我和我們上面實現的單例類是一樣的,只是將其變為模板(這個模板類目前還不是執行緒安全,要想達到執行緒安全,就必須和我們剛才講的一樣,加鎖)。

template

<

typename t>

class

lasingletontemplatebase

virtual

~lasingletontemplatebase()

public

:static t*

get_instance_ptr()

return sm_instance;

}static t&

get_instance_ref()

return

*sm_instance;

}static

void

remove_instance()

assert

(sm_instance ==0)

;}};

template

<

typename t>

t* lasingletontemplatebase

::sm_instance =0;

class

test

;void

main()

其實這個原理我們提供繼承乙個父類來實現乙個類不能拷貝。一般來說,如果我們要實現乙個類不能被拷貝,可以講類的拷貝建構函式和賦值運算子過載私有或者刪除。但是這樣做比較麻煩,當我們需要多個類不能被拷貝的話,在每個類中將其拷貝建構函式和賦值運算子過載私有或者刪除是非常麻煩的。而通過繼承乙個不能被拷貝的父類就可以一步實現。

class

noncopyable

~noncopyable()

private

:// emphasize the following members are private

noncopyable

(const noncopyable&);

const noncopyable&

operator=(

const noncopyable&);

};class

test

:public noncopyable

test

(const test &t)

private

:int m_data =0;

};class

test1

:public noncopyable

;void

main()

C 設計模式 單例類

本文假設有乙個manager管理類,單例類懶漢 餓漢模式的實現,和單例類的多執行緒安全性,最後介紹meyers singleton寫法。當第一次要用單例類的時候,再產生例項。是一種典型的拖延 lazy 策略。類宣告 class manager 類定義 單例物件指標初始化為nullptr,防止指向了未...

C 設計模式 1 單例模式

最近在設計模式的一些內容,主要的參考書籍是 head first 設計模式 同時在學習過程中也檢視了很多中關於設計模式的一些文章的,在這裡記錄下我的一些學習筆記,一是為了幫助我更深入地理解設計模式,二同時可以給一些初學設計模式的朋友一些參考。首先我介紹的是設計模式中比較簡單的乙個模式 單例模式 因為...

C 設計模式(1) 單例模式

單例模式的特點 1 該類只有乙個例項 2 該類在內部建立該例項 3 向整個系統公開這個例項介面 適用於多執行緒的四種程式設計方式 第一種 將建構函式設為私有可以保證其他類不能從這個類派生或者建立類的例項 另外 析構函式私有化則是為了讓某個類只能通過new來建立 class singletion1 p...