热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QT下单例模式

1优点提供了对唯一实例的受控访问。由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能

1 优点


  1. 提供了对唯一实例的受控访问。
  2. 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
  3. 允许可变数目的实例。

2 缺点


  1. 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
  2. 单例类的职责过重,在一定程度上违背了“单一职责原则”。
  3. 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
  4. 对象生命周期。单例模式没有提出对象的销毁,在提供内存的管理的开发语言中,只有单例模式对象自己才能将对象实例销毁,因为只有它拥有对实例的引用。在各种开发语言中,比如C++,其他类可以销毁对象实例,但是这么做将导致单例类内部的指针指向不明。

3 代码示例

懒汉模式:

class LogMannage
{
public:static LogMannage* instance(); //通过该接口访问void A();
private:static LogMannage *myLog; //单例模式定义的指针LogMannage(); //构造函数需要私有化,不能被外部new~LogMannage();
};//懒汉模式,静态变量初始化为空
LogMannage* LogMannage::myLog = NULL; LogMannage *LogMannage::instance() //接口返回类指针,如果指针为空则需要创建对象再返回对象指针(第一次调用)
{if(myLog == NULL) //如果要考虑到线程安全则需要添加互斥锁mPtr = new ThreadWifiBase();return mPtr;
}

饿汉模式:

class LogMannage
{
public:static LogMannage* instance(); //通过该接口访问void A();
private:static LogMannage *myLog; //单例模式定义的指针LogMannage(); //构造函数需要私有化,不能被外部new~LogMannage();
};//饿汉模式,静态变量初始化的时候即创建对象
LogMannage* LogMannage::myLog = new LogMannage(); LogMannage *LogMannage::instance() //接口返回类指针就行(饿汉模式指针初始化时就创建了)
{return myLog;
}

4 单例模式实现原理


1.1 私有化构造函数,使得外界不能通过new方式创建该单例对象。

1.2 创建静态对象指针。

1.1、1.2操作代码如下所示:

class RaspiTemp
{
private:static RaspiTemp *instancePrt; //创建静态对象指针explicit RaspiTemp(); //私有化构造函数~RaspiTemp();
}

1.3 单例对象访问接口定义:

需要定义为静态函数,可供外部直接访问而不需要依据对象指针访问。代码如下:

public:static RaspiTemp* instance(); //定义

1.3 单例对象的创建

懒汉模式是在需要用的时候,即首次访问时才创建单例对象,所以首次访问相对比较慢。懒汉模式就好像一个懒人(狠人),一直懒得找对象,在需要结婚的时候才去找对象,有了对象后就结婚;而对应的饿汉就是,管他结婚不结婚,先找个对象再说,需要结婚的时候直接结就行了。

饿汉模式是在程序启动,静态变量(1.2中单例对象类的静态指针)初始化的时候就创建单例对象。由于静态变量初始化在代码导入内存时候就初始化了,即main函数运行之前就创建了单例对象,所以不存在线程安全问题。

1.3.1 懒汉模式实现

代码如下:

// .cpp文件中实现
RaspiTemp *RaspiTemp::instancePrt = NULL;
RaspiTemp*RaspiTemp::instance() //实现
{if(instancePrt== NULL) instancePrt= new RaspiTemp(); //懒汉模式下对象创建(首次调用instance时创建)return instancePrt;
}

1.3.1 饿汉模式实现

代码如下:

// .cpp文件中实现
RaspiTemp *RaspiTemp::instancePrt = new RaspiTemp(); //饿汉模式下对象创建(静态变量初始化时创建)
RaspiTemp*RaspiTemp::instance() //实现
{return instancePrt;
}

5 单例模式的线程安全实现

前面有说明,饿汉模式在静态变量初始化的时候就实例化了单例对象,所以不存在线程安全问题,而且其访问接口中只有返回对象指针而没有创建对象的代码。但是单例模式对象的创建是在首次访问的时候,如果两个线程同时访问的时候,就可能造成单例对象被重复构建而导致内存浪费(对!仅仅内存浪费而已),解决此方法就是使用互斥锁。

为了理解,还是使用之前例子说明一下,结婚前才找对象,其实就是相亲,在你没相亲成功前你就是单身状态,你可以同时相亲两个或多个妹子(帅哥),不巧结果全相中了,这时候你的对象就有了多个,而结婚的对象确只能一个(别问我为什么,我也不知道),于是其他对象就被放弃在那里;然后政府为了避免这种浪费可耻的现象,于是规定你在同一时刻只能相亲一个对象,这个对象相亲结束后才能相亲下一个,这样就能解决问题了不是,但是怎么做到呢?这就是需要上锁,首先判断指针是否为空(指向对象),如果为空就加锁,然后再判断一次后再创建对象。

懒汉模式中代码修改如下:

static QMutex staticMutexSend;
RaspiTemp *RaspiTemp::instance()
{if(instancePrt == NULL) {staticMutexSend.lock(); //保证线程安全if(instancePrt == NULL)instancePrt = new RaspiTemp ();staticMutexSend.unlock(); }return instancePrt ;
}

6 单例模式+独立子线程模式

多线程的实现,qt有两种方式,一种是继承Qthread类并重写run() 函数实现;一种是继承QObject类,使用QObject中的moveToThread() 函数实现。


推荐阅读
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • Spring Security 认证模块的项目构建与初始化
    本文详细介绍了如何构建和初始化Spring Security认证模块的项目。首先,通过创建一个分布式Maven聚合工程,该工程包含四个模块,分别为core、browser(用于演示)、app等,以构成完整的SeehopeSecurity项目。在项目构建过程中,还涉及日志生成机制,确保能够输出关键信息,便于调试和监控。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 使用 MyEclipse 和 TestNG 测试框架在 Java 中高效进行单元测试
    通过MyEclipse集成TestNG测试框架,可以在Java开发中高效地进行单元测试。本文介绍了在JDK 1.8.0_121和MyEclipse 10.0离线环境下配置和使用TestNG的具体步骤,帮助开发者提高测试效率和代码质量。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 工厂方法模式详解:莫勇鹏老师的深入解析与应用实例
    2019年,独角兽企业高薪招聘Python工程师时特别关注工厂方法模式(Factory Method Pattern)。该模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。莫勇鹏老师深入解析了这一设计模式,并提供了丰富的应用实例,帮助开发者更好地理解和运用工厂方法模式,提升软件设计的灵活性和可扩展性。 ... [详细]
  • ylbtech-进销存管理解决方案:进销存管理,即购销链管理,涵盖企业从采购(进)、库存(存)到销售(销)的全流程动态管控。其中,“进”涉及从市场询价、供应商选择、采购执行直至货物入库及支付流程;“销”则包括产品定价、客户报价、订单处理及销售出库等环节。该解决方案旨在通过信息化手段,提升企业运营效率,优化库存结构,增强市场响应速度。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 深入理解Java事务编程:可串行化隔离级别的快照隔离机制解析
    深入理解Java事务编程:可串行化隔离级别的快照隔离机制解析 ... [详细]
  • 使用Boost.Asio进行异步数据处理的应用程序主要依赖于两个核心概念:I/O服务和I/O对象。I/O服务抽象了操作系统接口,使得异步操作能够高效地执行。I/O对象则代表了具体的网络资源,如套接字和文件描述符,通过这些对象可以实现数据的读写操作。本文详细介绍了这两个概念在Boost.Asio中的应用及其在网络编程中的重要性。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 深入RTOS实践,面对原子操作提问竟感困惑
    在实时操作系统(RTOS)的实践中,尽管已经积累了丰富的经验,但在面对原子操作的具体问题时,仍感到困惑。本文将深入探讨RTOS中的原子操作机制,分析其在多任务环境下的重要性和实现方式,并结合实际案例解析常见的问题及解决方案,帮助读者更好地理解和应用这一关键技术。 ... [详细]
author-avatar
缺心眼的小L
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有