设计模式之单例
单例概述
单例意即类在整个工程里只能有一个实例。单例通常应用在如下场景中,类的构造是一个非常耗时的过程,并且,它没有多次构造的必要性。例如。你可以打开一个数据库连接,只在此连接上进行数据库操作。
那么怎确保它在整个工程中只有一个实例呢?我们可以通过将构造函数的访问权限设置为private,并辅助其它手段来保证,同时将拷贝构造函数和赋值构造函数声明为delete的。
知识储备
作用域
在c++中,变量根据定义的位置不同具有不同的生命周期,具体分为六种:语句作用域、类作用域、全局作用域、文件作用域、命名空间作用域、局部作用域(函数或者语句块)。相应的变量也分为局部变量、全局变量、局部静态变量和全局静态变量。
局部变量、全局变量、局部静态变量、全局静态变量
生存周期和作用域:生存周期指的是变量从定义开始到销毁经历的时间范围,而作用域指的是变量的可见代码域。
局部变量:局部变量具有局部作用域,例如函数的形参,定义在函数中的变量。从存储空间上来看,局部变量是在栈上分配空间的。从生存周期来看,它仅存在与被定义时到离开局部作用域的那一刻。
全局变量:全局变量具有全局作用域,意即,一个全局变量只能有一个定义,可以有多个声明,其它文件需要使用这个全局变量的话,需要使用extern进行声明,它被定义于任何函数(包括main函数)之外。从存储的角度来看,它被保存在了elf的.data段或者.bss段(根据是否被初始化而定)。从生存周期来看,它存在于整个程序运行期间,直到程序退出。
静态局部变量:静态局部变量就是在局部变量的前面加了static修饰符,它的作用域范围和局部变量相同,生存周期从定义时起,到进程结束时由操作系统负责销毁。从空间分配上来说它在elf的.data段。
静态全局变量:静态全局变量就是在全局变量的前面加了static修饰符,它具有文件作用域,所谓文件作用域即指这个变量仅在定义它的文件中生效,对其它文件不可见,就是说可以在文件a和文件b中定义两个同名的静态全局变量。从空间分配的角度看,它在elf文件的data段。
那么,类的数据成员怎么分类呢?实际上,类的数据成员不适用于上述分类方式。普通数据成员就是类的实例的一部分,实例在,在数据成员在,实例不在,则数据成员亡。对静态数据成员,它则是属于类本身的,假设我们有一个数据,需要多个对象共享,那么可以使用静态数据成员。
单例-饿汉模式
所谓饿汉模式即指无论该单例在工程中是否使用,都创建好这个单例。在c++11下饿汉模式的构建利用了静态变量在main函数开始执行前即初始化的行为。具体实现如下(我的代码都在云服务器上,看到是时候搞一波git了):代码明天见,待我弄好git!