一.概念
单例模式是一种常用的软件设计模式,只能生成一个实例对象的类是实现了Singleton(单例模型)的类型,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问.
二.代码实现
class Singleton
{
private:
private:
Singleton()
{
}
public:
static Singleton &getinstance()
{
static Singleton singleton;
return singleton;
}
};
分析:很多人在用C++实现Singleton时,首先想到的就是上面代码,其实上面代码是有问题的,不能实现单一实例。用static变量不是保证了对象的单一么?看看下面的测试你就明白了
int main()
{
Singleton p=Singleton::getinstance();
Singleton q=Singleton::getinstance();
cout<<"p : "<<&p<<" q :"<<&q<<endl;
return 0;
}
结果:
为什么q,p的地址不一样了?q,p的地址不一样岂不是说明构建了多个实例?其实在此的确构建了不止一个实例,因为在
Singleton p=Singleton::getinstance();
Singleton q=Singleton::getinstance();
中调用了默认复制构造函数和默认赋值构造函数,生成了两个实例,所以q,p的地址不一样。那么要怎样解决了?
三.代码的改善与优化
让getinstance()函数返回指针类型可以完美的解决上面的问题
class Singleton
{
private:
private:
Singleton()
{
}
public:
static Singleton *getinstance()
{
static Singleton singleton;
return &singleton;
}
};
测试一下看看
int main()
{
Singleton *p=Singleton::getinstance();
Singleton *q=Singleton::getinstance();
cout<<"p : "<<p<<" q :"<<q<<endl;
return 0;
}
结果:
p和q的地址是一样的,表明确实只生成了一个实例