Qt中单例模式的实现
来源:互联网 发布:淘宝兼职模特招聘 编辑:程序博客网 时间:2024/05/21 07:06
转自:https://blog.yeatse.com/2015/03/03/qt-singleton-implementation/
最简单的写法:
12345
static MyClass* MyClass::Instance(){static MyClass inst;return &inst;}
过去很长一段时间一直都这么写,简单粗暴有效。但是直接声明静态对象会使编译出的可执行文件增大,也有可能出现其他的一些问题,所以利用了Qt自带的智能指针QScopedPointer
和线程锁QMutex
,改成了需要时才动态初始化的模式:
12345678910111213
static MyClass* MyClass::Instance(){static QMutex mutex;static QScopedPointer<MyClass> inst;if (Q_UNLIKELY(!inst)) {mutex.lock();if (!inst) {inst.reset(new MyClass);}mutex.unlock();}return inst.data();}
既保证了线程安全又防止了内存泄漏,效率也没降低太多,简直完美。
可惜每次都要重复这么几行实在麻烦,于是写了一个模板类:
123456789101112131415161718
template <class T>class Singleton{public:static T* Instance(){static QMutex mutex;static QScopedPointer<T> inst;if (Q_UNLIKELY(!inst)) {mutex.lock();if (!inst) {inst.reset(new T);}mutex.unlock();}return inst.data();}};
使用的时候直接这样——
1
MyClass* inst = Singleton<MyClass>::Instance();
除了用模板类,还可以利用c++中强大的宏:
1234567891011121314
Q_DISABLE_COPY(Class) \public: \static Class* Instance() \{ \static QMutex mutex; \static QScopedPointerinst; \(Q_UNLIKELY(!inst)) { \mutex.lock(); \(!inst) inst.reset(new Class); \mutex.unlock(); \} \return inst.data(); \}
然后声明的时候,填加一行这个宏:
12345
class MyClass{DECLARE_SINGLETON(MyClass); // 声明单例模式//...}
好评好评。
当然,为了要保证真的是单例模式,还要把构造函数限制为private,不然以后什么时候忘记了这码事,在外面又new了一下就不好了。
另外Qt本身自带了一个宏Q_GLOBAL_STATIC
,也有类似单例模式的效果,QThreadPool::globalInstance()
函数的实现就是利用了这个宏。不过它的主要用处是声明全局变量,和Singleton还是有差别的。
阅读全文
0 0
- Qt中单例模式的实现
- Qt下单例模式的实现
- QT单例模式的宏实现
- 实现私有化(Pimpl) --- QT常见的设计模式
- Qt 实现的一个生产者消费者模式类
- QT触摸屏的实现
- qt状态机的实现
- QT托盘的实现
- Qt的多线程实现
- QT 钟表的实现
- Qt多线程的实现
- 详解 Qt 中实现单例模式
- 单例模式(Qt实现)
- QT实现模式对话框(Model)
- <Linux+Qt>使用Qt实现单例模式
- /LGC设计模式/GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
- iOS中单例模式的实现
- Java中单例模式的实现
- Java instanceof用法
- Concept with IIS 7.0 component
- GO语言学习系列:同步/异步/阻塞/非阻塞
- windows下配置play的相关环境
- Linux常用命令
- Qt中单例模式的实现
- [牛客网]错题整理(4)
- PriorityQueue
- 第一章:eclipse 中修改字体大小和编码格式
- C# 判断DATASET是否为空
- Vbs脚本经典教材
- 可靠传输的工作原理
- RxJava操作符大全(转载)
- 小哥哥带你撸设计模式之---工厂方法模式