設計模式 單件模式(Singleton)

2021-08-25 18:45:07 字數 2210 閱讀 2796

singleton

在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在乙個例項,才能確保它們的邏輯正確性、以及良好的效率,比方說:執行緒池(threadpool)、快取(cache)、對話方塊、處理偏好設定和登錄檔的物件、日誌物件,充當印表機、顯示卡等裝置的驅動程式的物件。這些類物件只能有乙個例項,如果製造出多個例項,就會導致許多問題產生,例如:程式的行為異常、資源使用過量躲著是不一致的結果。遇到這種情況,我們可以通過單件模式來實現,這個模式保證在任何時刻都只有乙個物件。

通過維護乙個static的成員變數來記錄這個唯一的物件例項。

通過提供乙個static的介面instance來獲得這個唯一的例項。

(1) 當類只能有乙個例項而且客戶可以從乙個眾所周知的訪問點訪問它時。

(2) 當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改**就能使用乙個擴充套件的例項時。

(1) 單執行緒singleton實現

#ifndef _singleton_h_ #define _singleton_h_ class singleton ; #endif #include "singleton.h" #include "stdio.h" singleton* singleton::_instance = null; singleton::singleton() singleton *singleton::instance() return _instance; } void output() #include "singleton.h" #include "stdio.h" int main(int argc, char* argv)

以上**在單執行緒情況下不會出現任何問題。但是在多執行緒的情況下卻不是安全的。如兩個執行緒同時執行到 if (instance == null)判斷是否被例項化,乙個執行緒判斷為true後,在進行建立instance = new singlethread_singleton();之前,另乙個執行緒也判斷(instance == null),結果也為true。這樣就就違背了singleton模式的原則(保證乙個類僅有乙個例項)。

(2) 多執行緒singleton實現 引入執行緒保護**

#pragma once #include #include //執行緒安全使用的標頭檔案 #ifndef singletonh #define singletonh using namespace std; // base singlepattern class class singlepattern ; // thread safe class class cresguard ~cresguard() // isguarded is used for debugging bool isguarded() const public: class cguard ; ~cguard() protected: cresguard& m_rg; }; private: void guard() void unguard() // guard/unguard can only be accessed by the nested cguard class. friend class cresguard::cguard; private: critical_section m_cs; long m_lgrdcnt; // # of entercriticalsection calls }; // singleton container template class singleton ; virtual ~singleton(){}; public: static t* __fastcall getinstance() return m_instance.get(); } }; template cresguard singleton::_rs; templateauto_ptrsingleton::m_instance; // macro of singleton pattern to use #define declare_singleton(type) / friend class auto_ptr; / friend class singleton; / public: / static type *getinstance() / / protected: / __fastcall type() / / public: / virtual ~type() / #endif class mysingle : public singlepattern virtual void disposeinstance(){} public: void run(){}; }; int main(int argc, char* argv)

設計模式 建立型模式 單例模式 Singleton

4種單例模式 單執行緒單例 類class single private static single sin null public static single createinstance return sin 呼叫 console.writeline 單執行緒單例模式 single sin sin...

Java設計模式之單例模式(Singleton)

前言 在總結okhttp的時候,為了管理網路請求使用到了單例模式,晚上實在沒啥狀態了,靜下心來學習總結一下使用頻率最高的設計模式單例模式。單例模式 單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例特點 單例分類 1 懶漢單例 1 非執行緒安全實現 public class...

設計模式 單件模式

1 1 singleton.h ifndef singleton h define singleton h include using namespace std class singleton 構構函式,防止拷貝構造另乙個例項,作為protected singleton 析構函式,作為protec...