-
The
Singleton pattern
restricts a class so that only one instance can be created. This can be accomplished by making its constructor private or protected and providing an instance() function that creates a new instance if one does not already exist, but returns a pointer or reference to that instance if it does.
Singleton(单件) 模式的意图是:保证类仅有一个实例,并提供一个访问它的全局访问点。
应用于多线程环境的 Singleton 模式又叫做 Double-Checked Locking(双重检查锁定)模式。
代码
#include <QObject>
#include <QMutex>
#include <QMutexLocker>
class Singleton:public QObject
{
public:
static Singleton* instance()
{
static QMutex mutex;
if (!m_instance) {
QMutexLocker locker(&mutex);
if (!m_instance)
m_instance = new Singleton;
}
return m_instance;
}
private:
Singleton();
static Singleton* m_instance;
};
#include <QtCore/QCoreApplication>
#include "singleton.h"
Singleton *Singleton::m_instance = 0;
Singleton::Singleton():
QObject(qApp)
{
}
在C++中实现单件模式时,何时销毁对象似乎总是一个问题。在Qt中,由于程序中(一般)会有一个QCoreApplication或其派生类的对象,再加上QObject半自动的内存管理方式。我们将QCoreApplication的对象作为该单件对象的父对象,问题就应该迎刃而解了。
QCoreApplication
按照前面的说法:保证类仅有一个实例,并提供一个访问它的全局访问点
。QCoreApplication也应该属于单件模式。不过它的实现有点变态(中性词哈),看看它的代码:
class Q_CORE_EXPORT QCoreApplication : public QObject
{
public:
QCoreApplication(int &argc, char **argv);
static QCoreApplication *instance() { return self; }
...
private:
void init();
static QCoreApplication *self;
...
};
QCoreApplication *QCoreApplication::self = 0;
QCoreApplication::QCoreApplication(int &argc, char **argv)
{
init();
...
}
void QCoreApplication::init()
{
Q_ASSERT_X(!self, "QCoreApplication", "there should be only one application object");
QCoreApplication::self = this;
...
}
qApp
有人可能对这个宏感兴趣
#define qApp QCoreApplication::instance()
#if defined(qApp)
#undef qApp
#endif
#define qApp (static_cast<QApplication *>(QCoreApplication::instance()))
如果我们要派生QCoreApplication或QApplication,可能也会考虑重定义该宏。
参考
分享到:
相关推荐
此示例展示了Qml 的单例模式(类似全局对象,只生成一次实例,可全局使用) surfsky.cnblogs.com
C++完美实现Singleton模式
用VC实现的singleton 模式 在VS03,VC6.0下编译通过
Java的Singleton模式代码(免资源分),你会发现Java的Singleton模式真的很有趣,原来程序还可以这样写。
Singleton模式: 确保一个类只有唯一的一个实例。 Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton...
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
Qt singleton 代码演示, 最简单的演示
23种设计模式之三(创建型模式)Singleton模式
基于QT的单例设计模式开发和测试,包括:线程安全的单例生成、静态结构体数组使用和结构体指针new生成。
最简单的设计模式学习Singleton模式
描述设计模式之Singleton 模式的应、及举例说明了在JAVA中单利模式的具体应用。
c++ singleton单例模式
java Singleton单例模式 java Singleton单例模式
Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()...
单例模式 Singleton 单例模式线程安全问题和拓展
设计模式系列之01-单例模式(Singleton模式),很好的资源,理论实践结合讲述,逐步更新
简单的单例模式举例Singleton 分为恶汉式 懒汉式
只需要引用 #include "Singleton.h", 然后就可以用。记得 DBManager(QObject *parent = 0); 设置parent默认参数0;
Android Singleton单例模式运用详解