Qt下Singletonモードメモ

2782 ワード

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(単品)モードの意図は、クラスにインスタンスが1つしかないことを保証し、そのグローバルアクセスポイントにアクセスすることです.
マルチスレッド環境に適用されるSingletonモードはDouble-Checked Locking(二重チェックロック)モードとも呼ばれる.
コード#コード#
  • singleton.h
  • #include 
    #include 
    #include 
    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;
    };
  • singleton.cpp
  • #include 
    #include "singleton.h"
    
    Singleton *Singleton::m_instance = 0;
    
    Singleton::Singleton():
        QObject(qApp)
    {
    }

    C++で単品モードを実装する場合、オブジェクトを破棄するタイミングは常に問題のようです.Qtでは、プログラム(一般)にQCoreApplicationまたはその派生クラスのオブジェクトがあるため、QObject半自動のメモリ管理方式を加えます.QCoreApplicationのオブジェクトをこの単一オブジェクトの親として扱うと,問題は解決されるはずである.
    QCoreApplication
    前述したように、クラスにインスタンスが1つしかないことを保証し、そのグローバル・アクセス・ポイントにアクセスします.QCoreApplicationも単品モードに属するはずです.しかし、その実現は少し変態(中性語ハ)で、そのコードを見てみましょう.
  • qcoreapplication.h
  • 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.cpp
  • 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
    このマクロに興味がある人もいるかもしれません
  • qcoreapplication.h
  • #define qApp QCoreApplication::instance()
  • qapplication.h
  • #if defined(qApp)
    #undef qApp
    #endif
    #define qApp (static_cast(QCoreApplication::instance()))

    QCoreApplicationまたはQAPplicationを派生させる場合は、マクロの再定義も考慮される場合があります.
    リファレンス
  • Design Patterns Explained, Chapter 16
  • Introduction to Design Patterns in C++ with Qt 4, chapter 16
  • http://www.qtcentre.org/wiki/index.php?title=Singleton_pattern