单例类模板
文章目錄
- 1 單例類模板
- 1.1 單例模式簡介
- 1.2 單例類模板
1 單例類模板
1.1 單例模式簡介
需求的提出:在架構設計時,某些類在整個系統生命期中最多只能有一個對象存在(Single Instance)。
問題:如何定義一個類,使得這個類最多只能創建一個對象?
要控制類的對象數目,必須對外隱藏構造函數。思路如下:
- 將構造函數的屬性設置為private。
- 定義instance并初始化為NULL。
- 當需要使用對象時,訪問instance的值:
- 空值:創建對象,并用instance標記。
- 非空值:返回instance標記對象。
編程實驗:單例模式初探
#include <iostream> #include <string>using namespace std;class SObject {static SObject* c_instance;SObject(const SObject&);SObject& operator= (const SObject&);SObject(){} public:static SObject* GetInstance();void print(){cout << "this = " << this << endl;} };SObject* SObject::c_instance = NULL;SObject* SObject::GetInstance() {if( c_instance == NULL ){c_instance = new SObject();}return c_instance; }int main() {SObject* s = SObject::GetInstance();SObject* s1 = SObject::GetInstance();SObject* s2 = SObject::GetInstance();s->print();s1->print();s2->print();return 0; }如上實現存在的問題:
- 當我們需要使用單例模式時:必須定義靜態成員變量c_instance,必須定義靜態成員函數GetInstance()。
解決方案:
- 將單例模式相關的代碼抽取出來,開發單例類模板。當需要單例類時,直接使用單例類模板。
1.2 單例類模板
實現和使用方法如下:
Singleton.h:
#ifndef _SINGLETON_H_ #define _SINGLETON_H_template < typename T > class Singleton {static T* c_instance; public:static T* GetInstance(); };template < typename T > T* Singleton<T>::c_instance = NULL;template < typename T > T* Singleton<T>::GetInstance() {if( c_instance == NULL ){c_instance = new T();}return c_instance; }#endifmain.cpp:
#include <iostream> #include <string> #include "Singleton.h"using namespace std;class SObject {friend class Singleton<SObject>; // 當前類需要使用單例模式SObject(const SObject&);SObject& operator= (const SObject&);SObject(){} public:void print(){cout << "this = " << this << endl;} };int main() {SObject* s = Singleton<SObject>::GetInstance();SObject* s1 = Singleton<SObject>::GetInstance();SObject* s2 = Singleton<SObject>::GetInstance();s->print();s1->print();s2->print();return 0; }參考資料:
總結
- 上一篇: 芝麻信用分从600提升到700
- 下一篇: C语言中的异常处理