单例模式,顾名思义,一个类从始至终只有一个实例;
单例实质上就是“自定义静态数据类型”;
单例可应用于唯一资源,常用在资源共享、资源控制情况下,例如:访问数据库,打印机等。
下面这个例子将单例类抽象出来,做成模板基类,子类继承后便形成各自的单例,非常经典。
#include <iostream.h>
//单例基类
template <class T>
class Singleton
{
public:
static T& instance(void)
{
if(0 == instance_p_)
{
//lock
static T derived;
instance_p_ = &derived;
//unlock
}
return *const_cast<T*>(instance_p_);
}
protected:
Singleton() {};
virtual ~Singleton() {};
private:
static volatile T* instance_p_;
};
template <class T>
volatile T* Singleton<T>::instance_p_ = 0; //lint !e956
//实体类1
class Entity: public Singleton<Entity>
{
public:
Entity()
{
//在第instance中static T derived 被实例化
this->var = 10;
cout<<"Singleton Constructor"<<endl;
}
int getVar()
{
return this->var;
}
void setVar(int var)
{
this->var = var;
}
private:
int var;//成员变量(用于测试)
};
//实体类2
class Entity2: public Singleton<Entity2>
{
public:
Entity2()
{
//在第instance中static T derived 被实例化
this->var = 20;
cout<<"Singleton Constructor"<<endl;
}
int getVar()
{
return this->var;
}
void setVar(int var)
{
this->var = var;
}
private:
int var;//成员变量(用于测试)
};
int main()
{
int a = Entity::instance().getVar();
cout<<a<<endl;
Entity::instance().setVar(100);
a = Entity::instance().getVar();
cout<<a<<endl;
int b = Entity2::instance().getVar();
cout<<b<<endl;
Entity2::instance().setVar(200);
b = Entity2::instance().getVar();
cout<<b<<endl;
return 1;
}