美文网首页
Qt设计模式:单实例

Qt设计模式:单实例

作者: Qt工坊 | 来源:发表于2018-11-24 16:10 被阅读0次

    基本思想

    1. 私有化类的构造函数,作用:不允许在栈上创建对象或使用new操作符创建对象;
    2. 通过静态公有方法,如命名为:getInstance()获取对象实例;
    3. 确保类对象只被初始化一次,类成员具有全局唯一性。

    优点和用途

    1. 常用于程序的全局配置;
    2. 常用于程序引擎类;
    3. 用于数据的存储,保证数据的唯一性;
    4. 单实例对象同其他类成员的耦合性低,在包含单实例头文件的源代码文件中,通过单实例类名和作用域符号即可调用静态公有方法getInstance()来获取单实例对象,而不用把单实例对象设置为其他类的成员;调用单实例对象的公有静态方法一般命名为getInstance(),该函数返回单实例对象指针。

    示例代码

    engine.h

    #ifndef ENGINE_H
    #define ENGINE_H
    
    #include <QObject>
    class Engine : public QObject
    {
        Q_OBJECT
    public:
        //公有静态函数
        static Engine* getInstance();
        void doSomething();
    private:
        //私有构造函数
        explicit Engine(QObject *parent = 0);
    private:
        static Engine* m_engine;
        Q_DISABLE_COPY(Engine)//声明拷贝构造函数和赋值操作符运算为私有
    };
    
    #endif // ENGINE_H
    
    

    engine.cpp

    #include "engine.h"
    #include <QDebug>
    Engine* Engine::m_engine = NULL;//类外初始化静态成员
    static QMutex mutex;
    Engine::Engine(QObject *parent): QObject(parent)
    {
    }
    void Engine::doSomething()
    {
        qDebug()<<__LINE__<<__FUNCTION__;
    }
    Engine *Engine::getInstance()
    {
        if(m_engine == NULL)
        {
            QMutexLocker locker(&mutex);//确保线程安全
            if(m_engine == NULL)
            {
                m_engine = new Engine();
            }
        }
        return m_engine;
    }
    
    

    使用方法

    在程序需要用到Engine对象实例的地方,按如下方式调用单实例对象的方法即可。

    Engine::getInstance()->doSomething();
    

    相关文章

      网友评论

          本文标题:Qt设计模式:单实例

          本文链接:https://www.haomeiwen.com/subject/sxhyqqtx.html