單例模式簡析

2021-07-22 06:49:14 字數 1932 閱讀 9954

一、單例模式

單例模式確保乙個類只有乙個例項,自行提供這個例項並向整個系統提供這個例項。

特點就是多讀單寫。

函式簡單實現:

class

singleton

return

_sinstance;

} void

printf()

protected

:singleton()

:_data(0)

{} //防拷貝,只申明不定義

singleton(

singleton

&);singleton

&operator=(

singleton

&);//指向例項的指標定義為靜態私有,這樣定義靜態成員函式獲取物件例項

static

singleton

* _sinstance;

private

: int

_data;

};singleton

* singleton

::_sinstance =

null

; //初始化

int

main()

二、基於執行緒安全的改進

若有兩個執行緒同時訪問單例模式獲取物件的方法,thread1執行方法,第一次進入發現指標為null,在還沒有new之前,thread2也進入,這樣就不能保證只有乙個物件被建立,且第二個建立的物件將第乙個建立的物件覆蓋

解決方法:

1、懶漢模式

呼叫物件時才產生例項物件

改進static

singleton

*getinstance()

_mx.unlock();

} return

_sinstance;}

新增static成員物件

static

mutex

_mx;

在類外需要初始化

mutex

singleton

::_mx

但是,這麼做有會引入新的問題,即當發生new失敗時,則會發生拋異常, 而拋異常則會導致死鎖。

解決方法:可以使用raii,自動析構,guard

static

singleton

*getinstance()

} return

_sinstance;

}2、餓漢模式

最開始就建立物件

既執行緒安全,又高效

指標為靜態,在main函式之前初始化,

class

singleton

void

printf()

protected

:singleton()

:_data(0)

{} //防拷貝,只申明不定義

singleton(

singleton

&);singleton

&operator=(

singleton

&);//指向例項的指標定義為靜態私有,這樣定義靜態成員函式獲取物件例項

static

singleton

* _sinstance;

private

: int

_data;

};singleton

* singleton

::_sinstance =

newsingleton

;三、關於面試題

1、定義乙個類,只能在堆上生成物件

class

a private

: a() {}

a( const

a&); };

2、定義乙個類,只能在棧上生成物件

class

a ;

設計模式簡析(單例模式)

什麼是設計模式 設計模式是指設計某個程式的方式。今天我們簡析一下單例模式 單例模式 乙個類只能最多建立出乙個物件 實現單例必須滿足以下條件 1.不讓轉殖 私有化轉殖魔術方法 2。不讓建立物件 私有化構造方法 不能在類外部使用new關鍵字建立物件。3。進入類的內部建立物件 使用靜態方法 4.在類中使用...

設計模式之單例模式簡析筆記

好久沒這樣寫寫東西了,最近也真的是很忙,白天上班,晚上帶娃,還要學習。其實靜下心來好好的學習才發現自己要學習的太多了,技術更新換代的也很頻繁。每天堅持一點點學習,讓自己更充實,技術慢慢得到提公升。接下來的每一天都要學習,自己一定也能堅持。記錄下點滴。說的有點倉促,後面會更好 附上自己學習的一些筆記,...

單例模式的各種情況簡析

關鍵字 雙重檢驗 禁止指令重排序 鎖,反射 反序列化 列舉 what 單例模式是指,物件在記憶體中只存在乙份例項,每次獲取物件的時候,都是拿到的同乙個記憶體位址的物件。why使用單例模式,可以避免頻繁建立 銷毀物件這樣的開銷,直接獲取到位址值就可以。另一方面,有可能我們每次需要的都是同乙個物件,也就...