在架构设计时,某些类在整个系统生命期最多只有一个对象存在,这个时候单例模式的需求就发展出来,那如何定义一个类,使得这个类最多只能创建一个对象呢,思路如下
1.将构造函数的访问属性设置为private(外界无法创建对象)
2.定义instance并初始化为NULL
3.当需要使用对象时,访问instance的值
空值:创建对象,并用instance标记
非空值:返回instance标记的对象
例子:
#include <iostream>
using namespace std;
class Object
{
static Object * instance;
Object()
{
}
Object(const Object &obj)
{
}
Object& operator = (const Object &obj)
{
}
public:
static Object* GetInstance();
void print()
{
cout<<"this = "<<this<<endl;
}
};
Object* Object::instance = NULL;
Object* Object::GetInstance()
{
if( instance == NULL)
{
instance = new Object();
}
return instance;
}
int main()
{
Object * obj = Object::GetInstance();
Object * obj1 = Object::GetInstance();
Object * obj2 = Object::GetInstance();
obj->print();
obj1->print();
obj2->print();
return 0;
}
结果:
sice@sice:~$ ./a.out
this = 0x8074008
this = 0x8074008
this = 0x8074008
可以看出Object类任何时刻只有一个对象存在,这就是单例模式,对于单例模式得到的对象在整个系统的运行过程当中是不用释放的,但是上面的实现也有它的缺陷的,多个单例类就需要多个静态成员变量和静态成员函数,我们可以将单例模式相关的代码抽取出来,开发单例类模板,当需要单例类时,直接使用单例类模板
例子:
test.h
#ifndef _TEST_H_
#define _TEST_H_
template <typename T>
class Single
{
static T* instance;
public:
static T* GetInstance();
};
template <typename T>
T* Single<T>::instance = NULL;
template <typename T>
T* Single<T>::GetInstance()
{
if(instance == NULL)
{
instance = new T();
}
return instance;
}
#endif
test.c
#include <string>
#include <iostream>
#include "test.h"
using namespace std;
class Object
{
friend class Single<Object>;//定义友元关系使其能够访问Object的print函数
Object()
{
}
Object(const Object &obj);
Object& operator = (const Object &obj);
public:
void print()
{
cout<<"this = "<<this<<endl;
}
};
int main()
{
Object * obj = Single<Object>::GetInstance();
Object * obj1 = Single<Object>::GetInstance();
Object * obj2 = Single<Object>::GetInstance();
obj->print();
obj1->print();
obj2->print();
return 0;
}
结果:
sice@sice:~$ ./a.out
this = 0x8d80008
this = 0x8d80008
this = 0x8d80008
总结:
单例模式是开发中最常用的设计模式之一
单例模式的应用使得一个类最多有一个对象
可以将单例模式相关的代码抽象成类模板
需要使用单例模式的类直接使用单例模板