c++ 单例模式_Qt单例模式

有些时候我们在做qt项目的时候,要用到很多类.

例如我们用到的类有A,B,C,D.

其中,A是B,C,D中都需要用到的类,A类非常的抢手.

但是,A类非常的占内存,定义一个A对象需要500M内存,假如在B,C,D中都定义一个A类对象,对 内存的消耗是可想而知的.

所以B,C,D分别都定义一个A类对象是不可能的.

那么我们此时就希望:

能不能把A定义成"全局变量",然后这样子B,C,D类都能访问,并且整个程序就只有这一个A?

答案是可以的,定义A的时候以单例模式定义即可.

1-单例模式用来做什么

正如之前所说,单例模式:

(1) 整个程序只有一个对象;

(2) 整个程序都能访问到它;

(3) 分为"懒汉模式"和"饿汉模式";

(4) "懒汉模式"是用到单例的时候才创建,否则不创建对象;

(5) "饿汉模式"是不管三七二十一程序一启动就创建对象;

单例模式是在大型项目用到非常多的,例如:

(1) 一个日记记录类,必须整个程序只能有一个,假如有2个,在写日志文件时会相互"践踏".

(2) 数据库操作,连接类,必须整个程序只能有一个,假如有2个就会出问题,你想看假如2个进程同时使用同一个账号,然后写入同一个数据会发生什么事情...

单例模式有效的解决了重复定义对象的问题,假如配合互斥锁,还可以解决多进程,线程之间的同步互斥问题,也就是同一时间只能有一个进程操作单例对象.

2-设计单例模式

设计单例模式非常简单:

(1) 在类A里定义一个静态的指针self;

(2) 当调用获取A对象的指针时,判断这个self是否为空,假如为空则创建新对象并赋值给self并返回self,存在则直接返回self;

在此使用用的最多的"懒汉模式"进行演示:

cpp代码如下:

//这句一定要写,因为self是静态变量,必须要初始化值ClassA* ClassA::self = NULL;ClassA *ClassA::getInstance(){    //判断是否是第一次调用    //假如不为NULL,会直接return    if (self == NULL) {        //防止多进程同时调用创建2个对象的问题        //原理是因为是静态变量只会定义一次        static QMutex mutex;        //上锁        QMutexLocker locker(&mutex);        //在判断一次,防止其它进程抢先new过了        if (self == NULL) {            self = new ClassA;        }    }    return self; //返回指针}

头文件:

class ClassA : public QObject{    Q_OBJECTpublic:    //通过它获取self指针,这个函数是静态调用,不需要创建对象就可以访问    static ClassA *getInstance();    //构造函数    explicit ClassA(QObject *parent = 0);    void hello(){ //一个普通函数        qDebug() << "hello world";    }private:    static ClassA *self; //静态指针};#endif // ICONFONT_H

在其它类里的调用方法:

ClassA::getInstance()->hello();

其中:

ClassA::getInstance()会获取全局的self指针,通过这个指针我们可以访问到里边的函数.

在任何类里,都可以无条件访问A对象,并且不需要创建A对象,而且A对象全局只有一个实例:

是的,单例模式就这么简单.

☆ END ☆

关注梅老师

学习嵌入式

梅老师

9e4e31a2239428d70cf3b65fb42296a3.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值