問題:
1.什麼是單例模式?
單例模式是軟體設計模式中的一種,它的核心結構只包含乙個被稱為單例的特殊類,通過單例模式保證系統中乙個類只有乙個例項。
對於系統中的許多類來說,只能有乙個例項。比如:windows系統資源管理器(如果不對物件唯一化,將會彈出多個視窗)
(1)視窗內容完全不一致 =》 記憶體資源浪費
(2)視窗內容不一致 =》 意味著在某一時刻,系統有多種狀態 =》與實際不符
這就體現了唯一性 => 即乙個類只有乙個物件例項化
那麼如何保證乙個類只有乙個例項,並且易於訪問呢?
2.單例模式的實現及其要點?
(1)某乙個類只有乙個例項 =》 單例模式的類只實現私有的建構函式
(2)自行向系統實現提供該例項 =》該類實現乙個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。
3.不說了,上**
當我在main函式中建立sgn時,系統會先給sgn在堆上開闢記憶體,然後呼叫建構函式去構造物件,但由於建構函式是私有的,外部不能訪問。但我們提供了乙個靜態的介面函式,當我們第一次訪問時,就會在堆上開闢乙個記憶體,然後將類型別的指標指向這塊記憶體,呼叫建構函式構造物件,當我們再訪問這個介面函式時,系統就會將指向這個物件的位址返回給我們,通過指標sgn去訪問這個物件。
3.懶漢單例模式與
惡漢單例模式
懶漢單例模式是在第一次獲取時才產生,餓漢模式是在程式執行時就產生。**如下:
而懶漢模式需要判斷_instance是否為空,這就產生了一些問題。
那如何解決這一問題呢?這裡就要引入鎖了。
4.鎖首先,資料的操作方式無非三種:讀讀、寫寫和讀寫。
而鎖一般也根據執行緒的狀態分為:互斥、讀寫鎖(阻塞)和自旋鎖(迴圈)
這裡用到了linux下的互斥鎖:
鎖一般是個很重的東西,解鎖開銷也很大,所以這裡加了雙重判斷是為了解決:
1.鎖的開銷
如果只有乙個if,那麼每次當系統執行到instance()這個函式時,都要進行加鎖和解鎖,而雙重判斷就避免了p不為空的情況。
2.避免執行緒安全問題
在加鎖期間可以出現的問題。
5.總結
單例模式的簡單分析
第一次寫東西,文體形式槽點多多,歡迎指正。單例模式是設計模式中比較簡單的乙個,學習起來比較容易理解。下面開始聊聊各種場景下的單例模式。單例模式的定義 乙個類有且僅有乙個例項,並且自行例項化向整個系統提供。單例模式的要素 1.私有的靜態的例項物件 2.私有的建構函式 保證在該類外部,無法通過new的方...
設計模式之單例模式分析
單例模式分為兩大類 懶漢式和餓漢式 其最主要的區別在於 懶漢式 指全域性的單例例項在第一次被使用時構建 餓漢式 指全域性的單例例項在類裝載時構建 日常我們使用的最多也是懶漢式,懶漢式是按需載入,能夠做到資源的最大利用 懶漢式 雖然這樣寫沒什麼問題,但是如果是多執行緒時可能出現問題了,如果多個執行緒同...
C 單例模式的簡單分析
單例模式也稱為單件模式 單子模式,可能是使用最廣泛的設計模式。其意圖是保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。單例模式要做如下事情 1.不能通過建構函式構造,否則就能夠例項化多個。建構函式需要私有宣告 2.保證只能產生乙個例項 適用場景 1.需要生成唯一序列...