单例模式
单例模式用来确保一个类仅存在一个实例,该模式亦提供对此唯一实例的全局访问点。单例模式要求创建一个类,它包含一个静态的方法,每次调用该方法时返回该类的一个实例。
注意点:
- 如果不想让客户能够创建新的实例,可以将类的默认构造函数声明为私有或者保护
- 如果想让单例不可复制,可以私有复制构造函数和赋值操作符
- 如果想禁止客户删除单例的实例,可以将析构函数声明为私有
- 为了保证之前构造的实例,在程序运行期间一直存在,不被析构,我们只能把指向这个实例的指针声明成静态变量,存放在静态存储区,把这个类的实例用new来构造,并放在堆里
单例模式的优缺点:
- 对唯一的实例受控访问 因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
- 缩小名空间 Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。
- 允许对操作和表示的精化 Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。可以用所需的类的实例在运行时刻配置应用。
- 允许可变数目的实例 可以控制Singleton类的数目
Code
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton* GetInstance();
void message();
protected:
Singleton(){};
Singleton(const Singleton&);
const Singleton& operator =(const Singleton&);
};
Singleton* Singleton::GetInstance(){
static Singleton _instance;
return &_instance;
}
void Singleton::message(){
cout<<"这是单例"<<endl;
}
int main()
{
Singleton *p = Singleton::GetInstance();
p->message();
Singleton *tmp =p;
if(tmp==p)
cout<<"这是确实是单例"<<endl;
return 0;
}