單例模式總結 C

2021-07-29 17:18:47 字數 3165 閱讀 9742

單例模式:保證在整個程式中只有乙個例項,並提供乙個各個程式模組都可以訪問的介面。

一、常用標準模式:

#include using namespace std;

class singleton

int m_x;

static singleton *m_instance;

public:

static singleton* getinstance()

return m_instance;

} static void destoryinstance() }

int getx() };

singleton *singleton::m_instance = nullptr;

int main()

這種模式有兩個缺點:

1.必須手動刪除例項

注意:系統並不能自動**new出的物件,當遇到單例類的析構函式中有必要的操作的時候,如:關閉檔案,釋放外部

資源,這是必須要刪除例項。

2.在多執行緒實現的程式中,不能保證只生成乙個例項,比如在第乙個執行緒進入if (m_instance == null)後生成例項之前,另

乙個程序也進入了此if語句的情況,就會產生兩個例項

二、針對第乙個缺點的改進:

#include using namespace std;

class singleton

~singleton()

int m_x;

static singleton *m_instance;

public:

static singleton* getinstance()

return m_instance;

} class gc

}}; static gc gc; //注意!必須是靜態成員,否則屬於singleton的例項同意不會析構

int getx() };

singleton *singleton::m_instance = nullptr;

singleton::gc singleton::gc; // 類的靜態成員變數必須在外部初始化,否則gc不會被構造,更不會析構

int main()

原理:程式結束時系統會自動釋放類的靜態成員變數(和全域性變數),所以當成員變數gc被釋放時會呼叫它的析

構函式,進而delete m_instance。

在這個原理的基礎之上,又有另一種方法:

#include using namespace std;

class singleton

int m_x;

public:

static singleton& getinstance()

int getx()

void setx(int _x) };

int main()

這種方法的優點是簡化了**,但也有缺點:

從上面的main函式中可以看出,通過預設的拷貝建構函式創造了另乙個例項,所以又有對應改進:

#include using namespace std;

class singleton

int m_x;

public:

static singleton* getinstance()

int getx()

void setx(int _x) };

int main()

也就是把引用換成了指標。

或者通過宣告私有拷貝和重置=運算子禁止賦值:

#include using namespace std;

class singleton

singleton(const singleton &);

void operator = (const singleton &);

int m_x;

public:

static singleton& getinstance()

int getx()

void setx(int _x) };

int main()

三、針對第二個缺點的改進

class lock  

~lock()

};

class singleton

;

singleton* singleton::pinstance = 0;

singleton* singleton::instantialize()

} return pinstance;

}

也就是所謂的「雙檢鎖」機制。

如果進行大資料的操作,加鎖操作將成為乙個效能的瓶頸,因此改進:

/*

** filename : singletonpatterndemo3

** author : jelly young

** date : 2013/11/20

** description : more information, please go to

*/#include using namespace std;

class singleton

static void destoryinstance() }

int gettest()

private:

singleton()

static const singleton *m_instance;

int m_test;

};const singleton *singleton ::m_instance = new singleton();

int main(int argc , char *argv )

原文:因為靜態初始化在程式開始時,也就是進入主函式之前,由主線程以單執行緒方式完成了初始化,

所以靜態初始化例項保證了執行緒安全性。在效能要求比較高時,就可以使用這種方式,從而避免頻繁的

加鎖和解鎖造成的資源浪費。

C 單例模式總結

c 單例模式總結 單例模式可以說是在開發過程中最常用的一種設計模式了,一般很多業務處理層都會實現單例模式。單例模式分為懶漢式和餓漢式,懶漢式是在呼叫的時候生成唯一的例項,餓漢式是在系統初始化的時候就實現例項。這裡有乙個有意思的問題,如何在不知道程式的時候,判斷單例是懶漢式或者是餓漢式?單例的實現是有...

單例模式總結

三種實現單例模式的對比 1.volatile關鍵字不但可以防止指令重排,也可以保證執行緒訪問的變數值是 主記憶體中的最新值 有關volatile的詳細原理,我在以後的漫畫中會專門講解。2.使用列舉實現的單例模式,不但可以防止利用反射強行構建單例物件 可以而且在列舉類物件被 反序列化 的時候,保證反序...

單例模式總結

單例模式的使用有乙個必要的條件,在乙個系統要求乙個類只有乙個例項時才應當使用單例模式。在懶漢式單例的時候為什麼要進行執行緒的控制呢?package 單例模式.懶漢模式 public class lazysingleton synchronized public lazysingleton getin...