设计模式(2)-单例模式(Singleton)

【更新】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
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值