36、不一樣的C++系列--單例類模板
阿新 • • 發佈:2019-01-05
單例類模板
對於單例模式,我們都已經很熟悉了,這裡我們來親手製作一個單例類模板:
- 目標:某些類在整個系統生命期中最多隻能有一個物件存在(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;
}
執行結果為:
this = 0x7ff9a2c02680
this = 0x7ff9a2c02680
this = 0x7ff9a2c02680
雖然實現了需求,但是也存在了幾個問題:
- 需要使用單例模式時:
- 必須定義靜態成員變數 c_instance
- 必須定義靜態成員函式GetInstance( )
- 解決方案
- 將單例模式相關的程式碼抽取出來,開發單例類模組。當需要單例類時,直接使用單例類模板。
再來寫一個示例:
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;
}
#endif
呼叫類:
#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;
}
執行結果為:
this = 0x7fc241402680
this = 0x7fc241402680
this = 0x7fc241402680