1. 需求:在架構(gòu)設(shè)計(jì)時(shí),某些類在整個(gè)系統(tǒng)生命期中“最多只能有一個(gè)對(duì)象存在(Single Instance)”。
問(wèn)題: 如何定義一個(gè)類,使得這個(gè)類最多只能創(chuàng)建一個(gè)對(duì)象?
2. 單例模式
要控制類的對(duì)象數(shù)目,必須對(duì)外隱藏構(gòu)造函數(shù)
思路:
(1) 將構(gòu)造函數(shù)的訪問(wèn)屬性設(shè)置為private
(2) 定義instance,并初始化為NULL
(3) 當(dāng)需要使用對(duì)象時(shí),訪問(wèn)instance的值:
* 如果是空值:創(chuàng)建對(duì)象,并用instance標(biāo)記
* 如果是非空值:返回instance標(biāo)記的對(duì)象
編程說(shuō)明:?jiǎn)卫J匠跆?/em>
#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 << c_instance << 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;
}
輸出結(jié)果:
0x8e76008
0x8e76008
0x8e76008
3. 單例類模板
問(wèn)題:需要使用單例模式時(shí):
- 必須定義靜態(tài)成員變量:
c_instance - 必須定義靜態(tài)成員函數(shù):
GetInstance()
解決方案:將單例模式相關(guān)的代碼抽取出來(lái),開發(fā)單例類模板。當(dāng)需要單例類時(shí),直接使用單例類模板。
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
main.h
#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;
}
輸出結(jié)果
this = 0x89f2008
this = 0x89f2008
this = 0x89f2008
4. 小結(jié)
- 單例模式時(shí)開發(fā)中最常用的設(shè)計(jì)模式之一
- 單例模式的應(yīng)用使得一個(gè)類最多只有一個(gè)對(duì)象
- 可以將單例模式相關(guān)的代碼抽象成類模板
- 需要使用單例模式的類直接使用單例類模板