C++設計モード--一例モード

7044 ワード

シングル・モード(シングル・モード)では、クラスにインスタンスが1つしかなく、グローバル・アクセス・ポイントが提供されます.
--『Head Firstデザインモード』
単一モードの3つの特徴:
  • グローバルにクラスインスタンスが1つしかないことを保証する
  • 一意のインスタンスは、クラスによってのみ作成できます.
  • は、プログラム全体にグローバル取得オブジェクトのアクセスポイント
  • を提供する必要がある.
    単一モードの利点:
  • グローバルにはクラスのオブジェクトが1つしかなく、メモリ
  • を節約します.
  • クラスオブジェクトの重複生成と破棄を回避し、パフォーマンスを向上させる
  • .
  • 唯一のクラスオブジェクトであり、データの正確性を保証する
  • シーンの操作
    レジストリ、スレッドプール、データベース接続クラスなど、グローバルで一意のシナリオのみを許可するために一般的に使用されます.これにより、メモリを節約し、データの正確性を保証できます.
     
    C++単例モードのいくつかの書き方:
    1.「餓漢式」は、その名の通り、インスタンス化対象戦略が常に「待ちきれない」、つまりプログラム全体が本当にオブジェクトに使用されているかどうかにかかわらず、プログラムの開始時に初期化されることが多い.
    「餓漢式」バージョン1では、メモリが漏れる可能性があります
    //singleton.h
    #ifndef __SINGLETON_H__
    #define __SINGLETON_H__
    
    class Singleton
    {
    private:
        Singleton();
        ~Singleton();
    
    public:
        static Singleton* getInstance();
        void print();
    
    private:
        static Singleton* singleton;
    };
    #endif
    //singleton.cc
    #include "singleton.h"
    
    #include 
    
    Singleton::Singleton()
    {
        std::cout << "Singleton create!" << std::endl;
    }
    
    Singleton::~Singleton()
    {
        if (singleton)
            delete singleton;
        
        std::cout << "Singleton destory!" << std::endl;
    }
    
    Singleton* Singleton::getInstance()
    {
        return singleton;
    }
    
    void Singleton::print()
    {
        std::cout << "This is Singleton Pattern" << std::endl;
    }
    
    Singleton* Singleton::singleton = new Singleton();
    

    お客様の使用:
    #include "singleton.h"
    
    #include 
    using namespace std;
    
    int main()
    {
        cout << "main..." << endl;
        Singleton* singleton = Singleton::getInstance();
        singleton->print();
        return 0;
    }
    

    Linuxでコンパイル実行:
    g++ -std=c++11 -o main main.cc singleton.cc
    ./main

    singletonはnewで明示的に生成されるため、解放するにはdeleteを明示的に呼び出す必要があります.しかし、お客様が使用するときに忘れてしまうことが多く、お客様が管理するのも論理的ではありません.
    改善1:
    deleteメソッドの追加
    void Singleton::deleteSingleton()
    {
       if (singleton)
            delete singleton;
    }
    #include "singleton.h"
    
    #include 
    using namespace std;
    
    int main()
    {
        cout << "main..." << endl;
        Singleton* singleton = Singleton::getInstance();
        singleton->print();
        singleton->deleteSingleton();
        return 0;
    }
    

     
    改善2:
    改善1では、お客様自身がプロファイルを呼び出す必要があります.つまり、お客様が管理する必要があります.これは論理に合わず、静的ポインタではなく静的変数に変更し、プログラムの終了時に自動的に解放されます.
    //singleton.h
    #ifndef __SINGLETON_H__
    #define __SINGLETON_H__
    
    class Singleton
    {
    private:
        Singleton();
        ~Singleton();
    
    public:
        static Singleton* getInstance();
        void print();
        void deleteSingleton();
    
    private:
        static Singleton singleton;
    };
    #endif
    #include "singleton.h"
    
    #include 
    
    Singleton::Singleton()
    {
        std::cout << "Singleton create!" << std::endl;
    }
    
    Singleton::~Singleton()
    {
        std::cout << "Singleton destory!" << std::endl;
    }
    
    Singleton* Singleton::getInstance()
    {
        return &singleton;
    }
    
    void Singleton::print()
    {
        std::cout << "This is Singleton Pattern" << std::endl;
    }
    
    Singleton Singleton::singleton;
    

     
    改善3:
    静的ポインタを使用する必要がある場合は、静的クラスを埋め込んで管理できます.
    #ifndef __SINGLETON_H__
    #define __SINGLETON_H__
    
    class Singleton
    {
    private:
        Singleton();
        ~Singleton();
    
    public:
        static Singleton* getInstance();
        void print();
        void deleteSingleton();
    
    private:
        static Singleton* singleton;
        class SingletonGc
        {
        public:    
            ~SingletonGc()
            {
                if (Singleton::singleton)
                    delete Singleton::singleton;
                
            }
        };
    
        static SingletonGc gc;
    };
    #endif
    Singleton* Singleton::singleton = new Singleton();
    Singleton::SingletonGc Singleton::gc;

     
     
    2.「怠け者」は、名前からも分かるように、オブジェクトが必要なときに作成されます.
    「怠け者」バージョン1:(スレッドが安全ではなく、メモリが漏洩する可能性がある)
    //singleton.h
    #ifndef __SINGLETON_H__
    #define __SINGLETON_H__
    
    class Singleton
    {
    private:
        Singleton();
        ~Singleton();
    
    public:
        static Singleton* getInstance();
        void print();
        void deleteSingleton();
    
    private:
        static Singleton* singleton;
    };
    #endif
    
    #include "singleton.h"
    
    #include 
    
    Singleton::Singleton()
    {
        std::cout << "Singleton create!" << std::endl;
    }
    
    Singleton::~Singleton()
    {
        std::cout << "Singleton destory!" << std::endl;
    }
    
    Singleton* Singleton::getInstance()
    {
        if (singleton == NULL)
            singleton = new Singleton();
        return singleton;
    }
    
    void Singleton::print()
    {
        std::cout << "This is Singleton Pattern" << std::endl;
    }
    
    Singleton* Singleton::singleton = NULL;

    メモリ漏洩ソリューションも同様です.
     
    「怠け者」バージョン2:(スレッドが安全で効率が悪い)
    #ifndef __SINGLETON_H__
    #define __SINGLETON_H__
    
    #include 
    
    class Singleton
    {
    private:
        Singleton();
        ~Singleton();
    
    public:
        static Singleton* getInstance();
        void print();
        void deleteSingleton();
    
    private:
        static Singleton* singleton;
        static pthread_mutex_t mutex;
    };
    #endif
    
    #include "singleton.h"
    
    #include 
    #include 
    
    Singleton::Singleton()
    {
        pthread_mutex_init(&mutex,NULL);
        std::cout << "Singleton create!" << std::endl;
    }
    
    Singleton::~Singleton()
    {
        pthread_mutex_destroy(&mutex);
        std::cout << "Singleton destroy!" << std::endl;
    }
    
    Singleton* Singleton::getInstance()
    {
        pthread_mutex_lock(&mutex);
        if (singleton == NULL)
            singleton = new Singleton();
        pthread_mutex_unlock(&mutex);
        return singleton;
    }
    
    void Singleton::print()
    {
        std::cout << "This is Singleton Pattern" << std::endl;
    }
    
    Singleton* Singleton::singleton = NULL;
    pthread_mutex_t Singleton::mutex;
    

     
    「怠け者」バージョン3:(スレッドは安全で、効率が高い)
    #include "singleton.h"
    
    #include 
    #include 
    
    Singleton::Singleton()
    {
        pthread_mutex_init(&mutex,NULL);
        std::cout << "Singleton create!" << std::endl;
    }
    
    Singleton::~Singleton()
    {
        pthread_mutex_destroy(&mutex);
        std::cout << "Singleton destroy!" << std::endl;
    }
    
    Singleton* Singleton::getInstance()
    {
        if (singleton == NULL){
            pthread_mutex_lock(&mutex);
            if (singleton == NULL)
                singleton = new Singleton();
            pthread_mutex_unlock(&mutex);
        }
        return singleton;
    }
    
    void Singleton::print()
    {
        std::cout << "This is Singleton Pattern" << std::endl;
    }
    
    Singleton* Singleton::singleton = NULL;
    pthread_mutex_t Singleton::mutex;