
文章目錄
- 單例模式
- 代碼實作
- 提升部分
- 多執行緒下的單例模式
- 餓漢式單例
- 懶漢還是餓漢?
- 單例模式的優缺點
單例模式
什么是單例模式呢?
在專案中,有些類是需要對它們進行“計劃生育”的,即這個類只能有一個實體,如果出現多個實體則會有資料不一致的風險,
單例模式:保證一個類僅有一個實體,并提供一個訪問它的全域訪問點,
這個模式的類,叫單例類,所以類圖我就不畫了吧,
單例模式的應用場景舉例:牽扯到資料問題,資料庫首當其沖,快取自然也跑不了,
代碼實作
//這里是.h檔案
//老板類單例
class Single_Boss
{
public:
static Single_Boss *instence();//獲取資料庫單例
//重點在這個函式
void run();
private:
Single_Boss();
~Single_Boss();
char *errmsg;
static Single_Boss *Boss;//實體
};
//源檔案
Single_Boss *Single_Boss::Boss= NULL;
Single_Boss::Single_Boss()
{
cout << "Big Boss" << endl; //debug
}
Single_Boss::~Single_Boss()
{
cout<<"Seeyou Boss"<<endl;
}
Single_Boss* Single_Boss::instence()
{
if(!Boss)
{
Boss= new Single_Boss();
}
return Boss;
}
void Single_Boss::run(){
cout<<"你好,歡迎光臨XXX,請問需要點什么服務?"<<endl;
}
int main()
{
//Single_Boss *boss = new Single_Boss(); //不信的話大可以將這一行放出來,下面那行屏蔽掉試試
Single_Boss *boss= Single_Boss::instence(); //這是在類外使用單例
boss->run();
return 0;
}
提升部分
多執行緒下的單例模式
曾經有一份真摯的資料庫擺在我眼前,可惜我沒有去珍惜它,直到我的專案屢屢崩潰,我才知道,如果能重來,我要加個鎖,,,
俱往矣,數風流人物,還看今朝,
來我們重新審視一下下面這段代碼:
Single_Boss* Single_Boss::instence() //1
{
if(!Boss) //2
{
Boss= new Single_Boss(); //3
}
return Boss;
}
如果在多執行緒情況下,一旦有兩個執行緒同時進入了 2 ,怎么辦?這不是十分正常的事情嗎?一點防范都沒有,這不是送人頭的行為嗎?
白給!!
所以,改一下:
Single_Boss* Single_Boss::instence() //1
{
lock(db_mutex); //假設這個鎖我已經初始化過了
if(!Boss) //2
{
Boss= new Single_Boss(); //3
}
unlock(db_mutex); //上鎖和解鎖一定要同時寫,就算忘記寫中間步驟,也要先寫解鎖
return Boss;
}
這樣寫,可還行?
當然可以,
也可以這樣再加上一層,會好一些:
Single_Boss* Single_Boss::instence() //1
{
if(!Boss){ //一重鎖定
lock(db_mutex);
if(!Boss) //二重鎖定
{
Boss= new Single_Boss();
}
unlock(db_mutex); //上鎖和解鎖一定要同時寫,就算忘記寫中間步驟,也要先寫解鎖
}
return Boss;
}
這個是“懶漢式單例”
餓漢式單例
什么是餓漢式呢?餓漢模式的關鍵:初始化即實體化
微調上面的代碼:
Single_Boss *Single_Boss::Boss= new Single_Boss();
Single_Boss* Single_Boss::instence()
{
//不需要進行實體化
//if(!Boss)
//{
// Boss= new Single_Boss();
//}
return Boss;
}
一般餓漢式加載所導致的弊端是可能我并不想使用實體但是實體已經被構造,相對于懶漢式的用則構造會造成記憶體的浪費,但是其實作方式很簡單,
懶漢還是餓漢?
選哪個可以看個人喜好吧,這里給出一點建議:
懶漢:在訪問量較小時,采用懶漢實作,這是以時間換空間,
餓漢:由于要進行執行緒同步,所以在訪問量比較大,或者可能訪問的執行緒比較多時,采用餓漢實作,可以實作更好的性能,這是以空間換時間,
單例模式的優缺點
優點
由于單例模式在記憶體中只存在一個物件,減少了記憶體的開支,特別是當物件需要頻繁的創建、銷毀時,而且創建或銷毀時性能又無法優化,單例模式的優勢就非常明顯,
單例模式可以避免對記憶體的多重占用,
單例模式可以在系統設定全域的訪問點,優化和共享資源訪問,這招我經常用,也很喜歡,因為確實方便,做一個標志位單例類,負責所有資料表的映射處理,(要了解可以私信我)
缺點
單例模式一般沒有介面,難以拓展,如果要拓展,考慮重構,
單例模式對于測驗是不利的,在并發環境中,如果單例沒有完成,是不能進行測驗的,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/257840.html
標籤:其他
上一篇:老鐵 666!快手上市暴漲 200%,超 4000 員工成為千萬富翁
下一篇:2021美賽C題經驗分享
