單例設計模式
- 什么是創建型設計模式
- 有哪些創建型設計模式
- 單例設計模式實現方法
- 餓漢式單例
- 懶漢式單例
- 實現方法
CSDN——C++單例模式詳解
單例設計模式是一種創建型設計模式
什么是創建型設計模式
創建型設計模式,就是通過控制對象的創建方式來解決設計問題。
有哪些創建型設計模式
- 單例設計模式
在整個應用程序中,一個類只有一個實例,并且提供全局訪問點 - 工廠設計模式
將代碼中散亂的new操作集中起來,放到工廠類中封裝為方法,屏蔽復雜的初始化、多個參數的依賴,簡化調用者的工作量;
并且這些被管理的類,生命周期也交給工廠類管理; - 抽象工廠模式
有抽象工廠類和具體工廠類
(1)抽象工廠針對每個產品提供一個創建方法
(2)具體工廠繼承自抽象工廠,實現具體的創建方法
單例設計模式實現方法
單例設計模式的實現分兩種:餓漢式和懶漢式
餓漢式單例
特點:
實例在類加載時創建;c++中沒有類加載概念,可以理解是靜態變量初始化過程;
因為是類加載時創建,所以創建過程是線程安全的。
懶漢式單例
特點:
實例在第一次被請求時創建
非線程安全,因為多個線程可能同時調用instance()方法
實現方法
(1)在單例類中delete掉拷貝構造函數和賦值運算符重載函數,將要用來初始化的構造函數設置為私有成員。
(2)單例類聲明一個該類指針類型的私有靜態成員instance,用來指向最終的實例化對象,和一個用于初始化的公有靜態成員函數instance();
instance()函數會返回實例對象的指針,instance函數中會判斷靜態成員instance是否為空來決定是否調用new來初始化;
餓漢式需要在全局調用instance函數,使實例在程序啟動時被創建;
(3)如何實現懶漢式單例的線程安全
方法1:使用雙重檢查鎖定:
在instance()函數中首先判定實例是否已經被創建,如果是,直接返回實例指針,如果沒有被創建,就先加鎖,然后再判斷一次實例是否被創建,沒有就創建對象;
由于雙重檢查鎖定只在實例沒有創建時才加鎖和創建實例,所以不會導致性能下降
方法2:使用C++的局部靜態變量:
在判斷實例沒有被創建時,創建一個局部靜態instance變量,返回引用,把線程安全的工作交給編譯器,編譯器可能會使用更高效的方法來實現,比如原子操作+內存屏蔽,具體如何實現要看所處的平臺以及編譯器的選擇
(4)可以結合RAII設計來實現自動管理單例對象生命周期
在單例類中添加一個helper成員類,helper構造時調用instance(),helper析構時調用disinstance()
單例類聲明一個靜態的helper類型變量,以程序的生命周期管理helper對象的生命周期,實現自動管理單例對象的生命周期。