設計模式筆記 單例模式

2021-07-12 02:32:20 字數 2205 閱讀 1682

單例模式在系統開發時很常見,乙個系統中可能會有多個單例模式的運用!它比全域性變數的好處?1.能控制生成時間,保證初始化順序?2. 容易保證執行緒安全(全域性變數需要多執行緒client單獨控制併發,單例在類實現中已經做到,無需client再處理)?3. 減少函式模組之間的耦合,減少命名衝突,便於管理? 可能這些都是好處吧!

我的專案開發過程中,經常會把單例模式和簡單工廠模式結合起來使用!比如:

class optsolver_api cgaselementfactory

;

比較重要的就是其中的getinnstance函式了,這的實現是:

cgaselementfactory& cgaselementfactory::getinstance()

也就是說現在一般都不使用那種靜態指標變數的方式了。可能是考慮到資源的釋放吧,不過我覺得即使開發人員在系統的最後忘了釋放單例new的物件,在系統執行結束時作業系統會自動收回!反正都是執行期一直存在的。採用上面的方式可能看著更優雅!

可能有人注意到上面**中有乙個受保護的=操作過載,這是因為,如果有人寫出如下的**:

cgaselementfactory factory = cgaselementfactory::getinstance();
單例可以拷貝的話,就違背了單例的意義!因此要把它設為受保護成員!拷貝構造也要保護,雖然這樣使用的不多。至此,乙個單例類基本就完成了,

具體到使用上就是cgaselementfactory::getinstance().***(這裡是createelement函式)()!!!

至於執行緒安全的,我直接拷貝網上別人的**吧!

class lock

~lock()

};class singleton

protected:

singleton();

private:

static singleton* _instance;

static mutex m;}

singleton *singleton::_instance = null;

singleton* singleton::getinstance()

}return _instance;

}

因為加鎖比較耗時,又因為_instance只在第一次使用(為null)的時候才會跑到鎖裡面,所以外層的if判斷就阻止了每次都加鎖的操作!

下面的單例**參考muduo庫用c++11裡的執行緒函式實現。這裡用到c++模板的sfinae特性,singleton在程式結束時用自帶的destroy()函式釋放資源。其實費了這麼大勁,也就是為了在singleton析構時能釋放掉資源。但singleton一般都是從建立開始一直存在到程式執行結束的,程式結束時它申請的所有資源都被作業系統**。後面的測試程式顯示有記憶體洩露,不太理解,雖然從表面上看testnodestroy類析構是沒有呼叫。

#include #include #include #include using namespace std;

namespace detail;}

templateclass singleton

private:

singleton();

~singleton();

static void init() }

static void destroy()

private:

static std::once_flag ponce_;

static t* value_;

};templateonce_flag singleton::ponce_;

templatet* singleton::value_ = null;

下面是測試程式:

class test

~test()

const string& name() const

void setname(const string& n)

private:

string name_;

};class testnodestroy

~testnodestroy() };

void threadfunc()

int main()

設計模式筆記 單例模式

1 懶漢式 1 執行緒不安全 public class singleton public static singleton getinstance return singleton 缺點 不支援多執行緒。2 執行緒安全 public class singleton public static syn...

設計模式筆記 單例模式

單例模式 保證乙個類只有乙個例項,並提供乙個方法訪問它的全域性訪問點。singleton類,定義乙個 getinstance 方法,允許客戶訪問它的唯一例項。getinstance 是乙個靜態方法,主要負責建立自己的唯一例項。public class singleton public static ...

設計模式筆記 單例模式

在單例模式中,對單例類的所有例項化得到的都是相同的乙個例項 1.餓漢式 靜態初始化 description 餓漢式 靜態常量 1.執行緒安全 2.在類載入的同時已經建立好乙個靜態物件,呼叫時反應速度快 在類裝載的時候就完成例項化,沒有達到lazy loading的效果。如果從始至終從未使用過這個例項...