一、單例模式
單例模式確保乙個類只有乙個例項,自行提供這個例項並向整個系統提供這個例項。
特點就是多讀單寫。
函式簡單實現:
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使用單例模式,可以避免頻繁建立 銷毀物件這樣的開銷,直接獲取到位址值就可以。另一方面,有可能我們每次需要的都是同乙個物件,也就...