單例模式:保證在整個程式中只有乙個例項,並提供乙個各個程式模組都可以訪問的介面。
一、常用標準模式:
#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...