物件導向很好地解決了「抽象」的問題,但是必不可免地要付出一定的代價,對於通常情況來講,物件導向的成本大都可以忽略不計。但是某些情況,物件導向所帶來的成本必須謹慎處理。
典型模式:
保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。 ——《設計模式》gof
singleton.cpp:
class
singleton
;singleton* singleton::m_instance=
nullptr
;//執行緒非安全版本
singleton* singleton::
getinstance()
return m_instance;
}//執行緒安全版本,但鎖的代價過高,(高併發時需等待)
singleton* singleton::
getinstance()
return m_instance;
//...解鎖
}//雙檢查鎖,但由於記憶體讀寫reorder不安全
//預想的new過程:malloc --> 呼叫建構函式 --> 返回物件指標
//編譯器有可能進行優化,reorder後的new過程:malloc --> 返回物件指標 --> 呼叫建構函式
//m_instance只是乙個記憶體位址,沒有經過構造器,不加volatile不能用
singleton* singleton::
getinstance()
}return m_instance;
}//c++ 11版本之後的跨平台實現 (volatile,只有vsc++可以使用,防止編譯器優化)
//也可以使用懶漢模式,不用這麼多**
所謂餓漢式,就是直接建立出類的例項化;
而對於懶漢式,就是在需要的時候再建立類的例項化
本文為懶漢式單例模式,具體差異請參考: 單例模式(懶漢式和餓漢式區別)
12 設計模式 單例模式 Singleton
動機 motivation 模式定義 舉個例子 其實單例模式重點是對static的應用 static變數是放在全域性區 有不同的叫法 可以理解為全域性變數,訪問許可權通過靜態成員函式訪問。class singleton singleton singleton m instance nullptr 執...
設計模式筆記 單例模式
單例模式在系統開發時很常見,乙個系統中可能會有多個單例模式的運用!它比全域性變數的好處?1.能控制生成時間,保證初始化順序?2.容易保證執行緒安全 全域性變數需要多執行緒client單獨控制併發,單例在類實現中已經做到,無需client再處理 3.減少函式模組之間的耦合,減少命名衝突,便於管理?可能...
設計模式筆記 單例模式
1 懶漢式 1 執行緒不安全 public class singleton public static singleton getinstance return singleton 缺點 不支援多執行緒。2 執行緒安全 public class singleton public static syn...