【更新】2012-6-11,添加原理说明
【描述】单例模式故名思意,就是运行时只允许存在一个实例,用于限制特定对象只被创建一次。常被用于数据库的设计中。
【原理】(2012-6-11)
理解单例模式,关键是理解static关键字。下面简要对static进行分析:
(1) 既然是static的,为什么程序每调用一次,不会重新初始化,使得变量值不断在变?
static是指存储的位置是静态(固定不变)的,即静态存储区。而不是指变量值是固定不变的。static有个重要的特性:如果将不属于外部接口的内容声明为static,可以防止用户使用预定义接口之外的任何方式访问堆栈中的值。
(2) 类中的static数据成员
不像普通数据成员,静态数据成员是独立于该类的任意对象存在的,每个静态数据成员是与该类(不是该类的对象)关联的对象,并不与该类的对象关联。因此,静态函数没有this指针。
(3) static与单例模式
由于static数据成员存储的位置是固定不变的,实质上,利用指针访问同一静态数据成员的不同实例,是访问同一内存地址。也就是说,访问同一静态数据成员的不同实例,实际上,访问的是同一实例(单例)。
main.cpp下述代码示例,s1、s2、s3,s4,s5是不同实例,分别new了不同的内存。但修改s1->test、s4->test,同时修改了s3,s4,s5三个实例中静态test值。实质上,s1->test、s2->test、s3->test、s4->test、s5->test是“同一”实例。(该测试须将Singleton构造函数声明为public,单例模式下,其构造函数应声明为private,之所以这样做,是为了防止调用构造函数构造对象)
//Test2
qDebug()<<s1->test;//s1->test = 1
s2->test++;
qDebug()<<s1->test;//s1->test = 2
qDebug()<<s2->test;//s2->test = 2
Singleton *s4 = new Singleton;
qDebug()<<s4->test;//s4->test = 1
Singleton *s5 = new Singleton;
qDebug()<<s5->test;//s5->test = 1
s1->test++;
s4->test++;
qDebug()<<s1->test;//s1->test = 3
qDebug()<<s2->test