单例模式

来源:互联网 发布:cf无后坐力软件 编辑:程序博客网 时间:2024/05/20 13:08

时间:2014.06.03

地点:基地二楼

--------------------------------------------------------------------------

一、单例模式的概念

  单例模式,即一个类只保证一个实例,并提供一个全局访问点,实例可以被所有程序模块访问。典型的应用如系统的日志输出。所以单例模式包括两个基本点:一是这个类只可以有一个实例,二是该实例是全局共享的。

--------------------------------------------------------------------------

二、单例模式的实现

  实现单例模式时,我们可定义这样一个类,该类使用一个私有的静态指针指向该类的唯一实例,用公共静态方法获得该类的唯一实例。即单例模式是通过类自身管理这个唯一实例。一种简单的单例模式实现如下:

class Singleton{public:static Singleton* GetInstance(){if (mp_instance == nullptr)mp_instance = new Singleton();return mp_instance;}private:Singleton() = default;static Singleton* mp_instance;};
由于现在构造函数是私有的,因此,我们不能通过构造函数创建实例,我们通过GetInstance来获得该类的唯一实例,这个实例是使用懒惰初始化,即当首次调用该函数时才创建这样一个实例,之后调用都是一直返回该唯一实例的指针。

但这里还存在问题,就是关于内存管理方面的问题,该单例合适被析构,内存合适被释放?

有一点大家知道在程序结束的时候全局变量以及类的静态成员变量都会被析构,前面我们已经说过,静态成员很大程度上就是一个全局变量,只是限定在类的范围内使用。利用这一一个特征,我们可使用一个嵌套类的静态成员变量,用于负责在析构函数中删除单例类的实例。因为照前面所述,类的静态成员将在程序结束时被析构,如此,我们在析构这个静态成员时,如果它的析构函数含有析构单例的部分,那么程序结束时顺便就将单例也析构掉了。

现在,改进后的单例如下:

class Singleton{public:static Singleton* GetInstance(){if (mp_instance == nullptr)mp_instance = new Singleton();return mp_instance;}private:Singleton() = default;static Singleton* mp_instance;class Garbo{public:~Garbo(){if (Singleton::mp_instance)delete Singleton::mp_instance;}};static Garbo garbo;};
现在,我们看到的单例类中嵌套了一个Garbo类,之所以定义它为私有内嵌类,是防止其他地方滥用,这个类应该是专用的。程序一旦结束,就会执行静态成员变量的析构,顺利地就把单例类的唯一实例析构。
--------------------------------------------------------------------------

三、单实例的特点

1.对于单例类来说,它具有一个指向唯一实例的静态指针,该指针是私有的。

2.对于单例类来说,它具有一个获得该唯一实例指针的函数,这个函数在首次调用时创建单实例。

3.构造函数私有化,使得实例的构造无法从别处开始。

4.单例类的内存管理,是定义一个私有内嵌类,再声明一个该内嵌类类型的静态成员,利用静态成员变量在程序结束时被析构的特点析构单例类的唯一实例。

0 0
原创粉丝点击