单例模式
单例模式是23种GOF模式中最简单的设计模式之一,属于创建型模式,它提供了一种创建对象的方式,确保只有单个对象被创建。这个设计模式主要目的是想在整个系统中只能出现类的一个实例,即一个类只能创建一个对象。根据已经学过的知识,其实现步骤有如下三步:
- 将构造函数私有化 。
- 在类中定义一个静态的指向本类型的指针变量 。
- 定义一个返回值为类指针的静态成员函数。
为了在类外面的定义类的全局对象、类的栈对象、类的堆对象等只有一个,所以构造函数必须用private修饰,只要能创建一个对象,就可以创建n个不同的对象,所以就不能让单例模式设计的类的构造函数随意调用;为了能创建对象,只能在类里面定义,这时需要定义一个静态成员函数,返回值为类指针,返回创建的类对象,为了不多次创建对象并接收堆空间创建的对象,需要设立一个数据成员作为条件进行判断,由于静态成员函数只能调用静态数据成员和静态成员函数,所以需要定义一个静态数据成员,指向本类型的指针变量;在堆空间创建了对象,所以需要在析构函数中delete,如果在析构函数中有delete语句,delete语句会执行析构函数,这样重复死循环,所以需要借助一个函数来释放堆空间上申请的空间,在destroy()函数中delete,而delete又会调用析构函数,这样就可以完成一个类只能创建一个对象的初衷了。
单例模式的用处:全局唯一的资源,就可以用单例模式进行设计,设计成一个单例类,然后就可以做一些相应的操作。
代码如下(示例):
#include <iostream>
using std::cout;
using std::endl;
//设计要求:一个类只能创建一个对象
class Singleton
{
public:
static Singleton * getInstance()
{
if(nullptr == _pInstance)
{
_pInstance = new Singleton();
}
return _pInstance;
/* return new Singleton();//用堆来创建对象容易控制 */
}
static void destroy()
{
if(_pInstance)
{
delete _pInstance;
_pInstance = nullptr;
}
}
private:
Singleton()
{
cout << "Singleton()" << endl;
}
/* public: */ //为了和Singleton()保持一致
~Singleton()
{
cout << "~Singleton()" << endl;
}
private:
static Singleton *_pInstance;
};
Singleton *Singleton::_pInstance = nullptr;
/* Singleton gS1;//2、全局对象 error */
/* Singleton gS2; */
int main()
{
/* Singleton s1;//1、栈对象 error */
/* Singleton s2; */
/* Singleton *ps1 = new Singleton(); //3、堆对象 error */
/* Singleton *ps2 = new Singleton(); */
Singleton *ps1 = Singleton::getInstance();
Singleton *ps2 = Singleton::getInstance();
Singleton::getInstance();
/* ps1->destroy(); */
cout << "ps1 = " << ps1 << endl;
cout << "ps2 = " << ps2 << endl;
Singleton::destroy();
Singleton::destroy();
return 0;
}