C++11の一例モード

3262 ワード

Singleton-オブジェクト作成モードの意図:1つのクラスに1つのインスタンスしかないことを保証します.いくつかのクラスでは、1つのインスタンスだけが重要です.システムにはプリンタがたくさんありますが、printer spoolerは1つしかありません.ファイルシステムとウィンドウマネージャは1つしかありません.Singletonモードには多くの利点がある:1)一意のインスタンスに対する制御されたアクセス2)ネームスペースの縮小3)操作と表現の精密化を可能にする4)可変数のインスタンスを可能にする5)クラス操作よりも柔軟である『設計モード』書における単一例モードに対するc++定義:
class Singleton{
public:
    static Singleton* getInstance(){
        if(ptrInstance==NULL)
            ptrInstance=new Singleton();
        return ptrInstance;
    }
private:
    Singleton(){}
    static Singleton *ptrInstance;
};

コンストラクション関数はプライベートであるため、この実装では、ユーザが一意のインスタンスにアクセスする方法はgetInstance()メンバー関数のみであり、getInstance()は怠惰な初期化を使用し、すなわち、その戻り値はこの関数が初めて作成されたときの値である.しかし、この実装には、(1)ptrInstanceポインタがいつ解放されるか(2)スレッドが安全であるという2つの欠点がある.コンストラクション関数Singleton()は複数回アクセスできるため、複数のスレッドアクセス時に作成される可能性のある値は異なる.
問題(1)については,静的メンバ変数を用いてプログラム終了時にシステムによって自動的に解析される.
class Singleton{
public:
    static Singleton* getInstance(){
        if(ptrInstance==NULL)
            ptrInstance=new Singleton();
        return ptrInstance;
    }
private:
    Singleton(){}
    static Singleton *ptrInstance;
    class Garbo{
    public:
        ~Garbo(){
            if(Singleton:ptrInstance)
                delete Singleton::ptrInstance;
        }
    };
    static Garbo garbo;//        ,          
};

問題(2)について,解決策はロックをかけることである.
if(ptrInstance==NULL){
    pthread_mutex_lock(&mutex);
    if(ptrInstance==NULL)
        ptrInstance=new Singleton();
    pthread_mutex_unlock(&mutex);
}

C++11のより良い方法は、静的メソッドを使用して、作成と破棄が一度しかないことを保証することです.
class Singleton{
public:
    static Singleton& getInstance(){
        static Singleton intance;
        return instance;
    }
private:
    Singleton() {}
    Singleton(Singleton const &)=delete;
    void operator=(Singleton const&)=delete;
};
  Singleton         ,   copy               ,  copy  ,      singleton