設計模式之單例模式的幾種寫法

2021-07-30 12:12:39 字數 2041 閱讀 8464

經過了前面幾次的面試,我發現面試官對設計模式方面的提問頻率是非常高的,所以學習設計模式是一件刻不容緩的事情,今天我們就來說一下設計模式中的單例模式吧。

設計模式並不是什麼神技,而是一套**的設計,是經驗的總結,使用設計模式是為了實現**的復用以及「解耦」,關於程式設計裡面解耦的概念可以參考一下下面這篇知乎。

這裡話不多少,給出一片不錯的部落格,大家可以去欣賞一下:

顧名思義,單例模式的含義就和它的名字一樣,就是乙個型別只能例項化乙個物件出來,並且這個物件對整個系統來說是可見的,也就是說我們要提供乙個全域性訪問點,向整個系統提供這個唯一的例項。

好了,經過了前面的敘述,我們現在可以寫下**了,這裡我們用c++來實現單例模式,語言不重要,思路才是關鍵。

class singleton1

return single;

}private:

singleton1() //注意建構函式是私有的

{}private:

static singleton1* single;

};singleton1* singleton1:: single=null;

這段**實現了單例模式的關鍵點有兩個:

1.保護

我們將類的建構函式宣告成非公有的,這樣就可以防止通過類的成員函式來在任何地方例項化物件,當然,我這裡寫的不是很嚴格,我們不光要對建構函式進行保護,我們還應該對拷貝建構函式以及賦值運算子過載等類的預設函式也提供保護。

2.類的成員變數申明為static型別:

這一點是很關鍵的,因為單例模式的設計中有乙個必要的原則就是類的例項物件只能有乙個,而且類的實體對整個系統都要提供介面來進行訪問,使用靜態變數可以滿足上面的要求,因為靜態變數只要物件已建立它就一直存在,知道程式結束完才被銷毀。

大家應該注意到我寫的類名為singleton1了吧,因為僅僅這樣實現是不夠的,還需要考慮一些其他的因素,例如多執行緒環境時執行上面的**就會出現問題,例如當第乙個執行緒執行到if (single == null) 的時候被系統切了出去,此時第二個執行緒也執行到了這句話,但是此時物件沒有被建立,所以single的狀態也就沒有發生變化,執行緒2會建立乙個物件,當回到執行緒1時,由於判斷條件已經執行過了,所以執行緒1也會建立這個物件,這就導致在乙個程序中有兩個物件,違背了單例模式的設計原則。

上述問題的發生是因為執行緒安全性的問題所導致的,我們可以引入互斥鎖來解決這個問題,因此在多執行緒的環境下,單例模式的**可以這樣來寫:

std::mutex g_lock;

class singleton

g_lock.unlock();

return single;

}private:

singleton() //注意建構函式是私有的

{}private:

static singleton* single;

};singleton* singleton:: single=null;

我們通過引入互斥鎖來維護了上面提到的執行緒安全之間的問題,但是各個執行緒反覆的申請鎖是很影響效能的,所以我們還可以在此基礎上再增加一層判斷條件,當single為null時才允許申請鎖資源。

std::mutex g_lock;

class singleton

g_lock.unlock();

}return single;

}private:

singleton() //注意建構函式是私有的

{}private:

static singleton* single;

};singleton* singleton:: single=null;

好了,**在這裡就基本實現完了,我們現在可以再來回顧一下單例模式。

通過觀察前面的**,我們可以發現單例模式的作用其實就像全域性變數一樣,可以說是全部變數的替代品,它擁有全部變數的特性,例如生命週期等。但此外,它還有一些全部變數所不具有的特性,單例模式中,同乙個型別的例項物件只能有乙個,此外,單例模式還提供了延遲初始化,以提高程式的效能。

設計模式 單例模式的幾種寫法

一 單例模式 單例模式是一種建立型的模式,指某個類採用單例模式後,在這個類被建立後,只產生乙個例項以供外部訪問,且提供乙個全域性的訪問點。單例模式在開發中具有相當大的重要性,並且 實現相對簡潔。所以其是為數不多的在面試中會被問到且要求手擼 的設計模式哦 二 幾種單例的寫法及比較 1.飽漢模式 pac...

單例模式幾種寫法

1.餓漢式 public class singleton public static singleton getinstance 2.懶漢式 public class singleton 雙層檢測鎖 public static singleton getinstance return instanc...

單例設計模式的幾種簡單寫法。

單例設計模式 其定義是單例物件的類只能允許乙個例項存在。1,飽漢式 優點 懶載入,節約記憶體空間。缺點 執行緒不安全,當有多個執行緒時,乙個執行緒進入if語句,還沒來得及執行,另乙個執行緒也進去了。結果可能會產生多個例項。public class singleton public static si...