1、什么是单例模式:
确保一个类仅有一个唯一的实例,并且提供一个全局的访问点。
2、环境及问题:
如上图所示,每次使用一个类的时候,首先都需要实例化一个对象。不管是new还是定义局部变量。但多次调用new,就会拿到多次该对象的实例。那有没有这样一种情况:多次调用new时都拿到同一个实例化对象?比如数据库连接,大家都知道建立一个数据库连接消耗的资源是巨大的,那是不是每次需要操作数据库的时候都要先建立一个连接呢?有没有一种方法可以让已建立的数据库连接复用?这就是单例模式要解决的问题。
上图无论new多少次,都指向类的一个示例,这就是单例模式。它解决了单例模式的独生子女问题,保证了在同一时刻只有类的唯一对象存在。
3、解决方案(c++):
- 首先将构造方法私有化,屏蔽通过直接实例化的形式来访问。将函数申明改成private属性
- 在类中声明一个实例,并设置成静态类型。保证该类只有一份
- 提供一个可以获取实例的方法,用于返回类的示例,并保证得到的是同一个对象
4、代码实现:
实现一:
class A
{
private:
A(){} //构造函数私有化
public:
static A& GetInstance() //静态函数,获取类唯一成员的接口
{
static A globalInstance; //静态成员,类唯一成员
return globalInstance;
}
void print()
{
std::cout<< "Single Instance Pattern"<< std::endl;
}
};
调用方式:
int main()
{
A::GetInstance().print();
return 1;
}
实现二:泛型方法
template<class T>
class SingleInstancePattern
{
public:
static T& GetInstance()
{
static T globalInstance;
return globalInstance;
}
};
调用方式:
class A: public SingleInstancePattern<A>
{
public:
void print()
{
std::cout<< "Single Instance Pattern"<< std::endl;
}
};
int main()
{
/*注意:此单例模式是使用继承模板类实现,其优点是可复用,需要用单例
的类只需继承SingleInstancePattern模板类即可。但因为模板类中并没
有将该类的构造函数私有化,所以直接局部变量实例化对象也是可以的,这就
需要在代码实现层严格控制每个实例化对象都通过调用模板类中GetInstance()
方法获得才能保证其唯一性。对于单例模式的原则而言,这种实现方式并
不属于严格的单例实现,但因为模板类的可复用和实现简单也被广泛使用
*/
A::GetInstance().print();
return 1;
}