欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式之单例

程序员文章站 2022-03-18 16:47:59
单例概述 单例意即类在整个工程里只能有一个实例。单例通常应用在如下场景中,类的构造是一个非常耗时的过程,并且,它没有多次构造的必要性。例如。你可以打开一个数据库连接,只在此连接上进行数据库操作。 那么怎确保它在整个工程中只有一个实例呢?我们可以通过将构造函数的访问权限设置为private,并辅助其它 ......

单例概述

       单例意即类在整个工程里只能有一个实例。单例通常应用在如下场景中,类的构造是一个非常耗时的过程,并且,它没有多次构造的必要性。例如。你可以打开一个数据库连接,只在此连接上进行数据库操作。

  那么怎确保它在整个工程中只有一个实例呢?我们可以通过将构造函数的访问权限设置为private,并辅助其它手段来保证,同时将拷贝构造函数和赋值构造函数声明为delete的。

知识储备

作用域

   在c++中,变量根据定义的位置不同具有不同的生命周期,具体分为六种:语句作用域、类作用域、全局作用域、文件作用域、命名空间作用域、局部作用域(函数或者语句块)。相应的变量也分为局部变量、全局变量、局部静态变量和全局静态变量。

局部变量、全局变量、局部静态变量、全局静态变量

  生存周期和作用域:生存周期指的是变量从定义开始到销毁经历的时间范围,而作用域指的是变量的可见代码域。

       局部变量:局部变量具有局部作用域,例如函数的形参,定义在函数中的变量。从存储空间上来看,局部变量是在栈上分配空间的。从生存周期来看,它仅存在与被定义时到离开局部作用域的那一刻。

       全局变量:全局变量具有全局作用域,意即,一个全局变量只能有一个定义,可以有多个声明,其它文件需要使用这个全局变量的话,需要使用extern进行声明,它被定义于任何函数(包括main函数)之外。从存储的角度来看,它被保存在了elf的.data段或者.bss段(根据是否被初始化而定)。从生存周期来看,它存在于整个程序运行期间,直到程序退出。

        静态局部变量:静态局部变量就是在局部变量的前面加了static修饰符,它的作用域范围和局部变量相同,生存周期从定义时起,到进程结束时由操作系统负责销毁。从空间分配上来说它在elf的.data段。

        静态全局变量:静态全局变量就是在全局变量的前面加了static修饰符,它具有文件作用域,所谓文件作用域即指这个变量仅在定义它的文件中生效,对其它文件不可见,就是说可以在文件a和文件b中定义两个同名的静态全局变量。从空间分配的角度看,它在elf文件的data段。

        那么,类的数据成员怎么分类呢?实际上,类的数据成员不适用于上述分类方式。普通数据成员就是类的实例的一部分,实例在,在数据成员在,实例不在,则数据成员亡。对静态数据成员,它则是属于类本身的,假设我们有一个数据,需要多个对象共享,那么可以使用静态数据成员。

单例-饿汉模式

  所谓饿汉模式即指无论该单例在工程中是否使用,都创建好这个单例。在c++11下饿汉模式的构建利用了静态变量在main函数开始执行前即初始化的行为。具体实现如下(我的代码都在云服务器上,看到是时候搞一波git了):代码明天见,待我弄好git!