在我们开发的过程中,有时候我们只需要创建一个对象,比如超市里的收银系统,扫描系统就可以完成任务,所以在架构设计的时候我们怎么能保证这些类在系统的生命周期只存在一个对象(Single Instance)。那么我们该如何定义一个类,使得这个类最多智能创建一个对象?这其中就用到我们的单例模式。
单例模式
- 在整个系统的运行过程中,我们要控制类的数目,
必须对外隐藏构造函数
- 思路
1.将构造函数的访问属性设置为private
2.定义对象instance
并初始化为NULL
3.当需要使用对象时,访问instance
的值,当为空值时创建对象,并且用instance标记,当为非空值时,返回instance标记的对象
代码实现:
#include <iostream>
using namespace std;
class Sobject
{
public:
static Sobject* getInstance();
void print();
private:
static Sobject* sInstance;
Sobject(){}
};
Sobject* Sobject::sInstance = NULL;
void Sobject::print()
{
cout << "this = " << this << endl;
}
Sobject* Sobject::getInstance()
{
if (sInstance == NULL)
{
sInstance = new Sobject();
}
return sInstance;
}
int main()
{
Sobject* sp = Sobject::getInstance();
Sobject* sp1 = Sobject::getInstance();
sp->print();
sp1->print();
return 0;
}
存在的问题:
在使用单例模式时,必须定义静态成员变量sInstance
,而且必须定义静态成员函数getInstance()
,那么有什么解决方式呢,我们可以将单例模式相关的代码抽取处理,开发单例类模板。当需要单例类时,直接使用单例类模板
单例类模板的代码实现:
#include <iostream>
using namespace std;
template
<typename T>
class Singleton
{
public:
static T* getInstance();
private:
static T* sInstance;
};
template
<typename T>
T* Singleton<T>::sInstance = NULL;
template
<typename T>
T* Singleton<T>::getInstance()
{
if (sInstance == NULL)
{
sInstance = new T();
}
return sInstance;
}
class Sobject
{
public:
friend class Singleton<Sobject>;//当前类需要单例模式
void print()
{
cout << "this" << this << endl;
}
private:
};
int main()
{
Sobject* sp = Singleton<Sobject>::getInstance();
Sobject* sp1 = Singleton<Sobject>::getInstance();
Sobject* sp2 = Singleton<Sobject>::getInstance();
sp->print();
sp1->print();
sp2->print();
return 0;
}
结果:
this = 013B4808
this = 013B4808
this = 013B4808
小结:
- 单例模式是开发中最常用的设计模式之一
- 单例模式使得
一个类最多只有一个对象
- 可以将单例模式相关的代码抽象为类模板
- 需要使用单例模式的类直接使用
单例类模板