1.单例模式(设计模式)
在架构设计时,某些类在整个系统生命期中最多只能有一个对象存在(Single Instance)
2.单例模式思路:
要控制类的对象数目,必须对外隐藏构造函数。
将构造函数的访问属性设置为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 = 0x880f008
this = 0x880f008
this = 0x880f008
分析:
单例模式是只有一个对象,所以指针都指向了同一个地址,证明了一个类只创建了一个对象。
设计分析:
-> 定义静态成员变量为空,用来标记对象(定义成静态,让每个对象具有相同属性)。
-> 将所有创建对象方式都私有化(为了防止运行期间再次被创建新的对象),只提供静态成员函数static SObject* GetInstance();返回静态成员便c_instance;(静态成员函数只能访问静态成员变量)。
-> 判断c_instance是否为空。变量为空创建对象;否则直接返回c_instance。(保持类只有一个对象)。
-> 单例模式要在系统运行周期一直存在,所以不需要释放(没有析构函数)。
3.单例类模板
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
62-2.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;
}
结果:
this = 0x9621008
this = 0x9621008
this = 0x9621008
小结:
-> 单例模式是开发中最常用的设计模式之一。
-> 单例模式的应用使得一个类最多只有一个对象。
-> 可以将单例模式相关的代码抽象成类模板。
-> 需要使用单例模式的类直接使用单例类模板。