設計モード——単例モード(C++実現)


単一モードは、単一モード、単一サブモードとも呼ばれ、最も広く使用されている設計モードである可能性があります.クラスに1つのインスタンスしかないことを保証し、すべてのプログラムモジュールで共有されるグローバルアクセスポイントにアクセスすることを目的としています.システムのログ出力、GUIアプリケーションは単一マウスでなければならず、MODEMの接続には1本の電話線しか必要とせず、オペレーティングシステムにはウィンドウマネージャが1つ、PCが1つ、キーボードが1つしか接続できないなど、多くの場所でこのような機能モジュールが必要です.
 
単一例モードには多くの実装方法があり,C++では1つのグローバル変数で直接行うこともできるが,このようなコードは非常に優雅ではない.グローバル・オブジェクトを使用すると、インスタンスへのアクセスが容易になりますが、1つのオブジェクトのみを宣言することは保証されません.つまり、1つのグローバル・インスタンスを除いて、同じクラスのローカル・インスタンスを作成することは保証されません.
「設計モード」という本では、クラスのプライベート静的ポインタ変数を使用してクラスの唯一のインスタンスを指し、共通の静的方法でインスタンスを取得する単一のクラスを定義する優れた実装が示されています.
単一のインスタンス・モードは、クラス自体によって一意のインスタンスを管理し、問題を解決する方法を提供します.唯一のインスタンスはクラスの一般的なオブジェクトですが、このクラスを設計すると、インスタンスを1つだけ作成し、このインスタンスにグローバルアクセスできるようにします.ユニークインスタンスクラスSingletonは、静的メンバー関数でインスタンスの作成操作を非表示にします.このメンバー関数をInstance()と呼ぶのが習慣で、その戻り値は唯一のインスタンスのポインタです.
簡単な単例モードを以下のように実現しました.
#include "stdafx.h"

#include <iostream>

using namespace std;



class Singleton

{

public:

    static Singleton* GetInstance()

    {

        if(m_pInstance == NULL)

            m_pInstance = new Singleton();

        return m_pInstance;

    }

    void Show()

    {

        count ++;

        cout << "count=" <<count << endl;

    }

private:

    Singleton(){};

    static int count;

    static Singleton* m_pInstance; 

};

int Singleton::count = 0;

Singleton* Singleton::m_pInstance = NULL;

int _tmain(int argc, _TCHAR* argv[])

{

    Singleton* s = Singleton::GetInstance();

    s->Show();

    Singleton* s2 = Singleton::GetInstance();

    s2->Show();

    cin.get();

    return 0;

}

ユーザーが一意のインスタンスにアクセスする方法はGetInstance()メンバー関数のみです.この関数を使用しないと、クラスのコンストラクション関数がプライベートであるため、インスタンスを作成する試みは失敗します.GetInstance()は、怠惰初期化を使用します.つまり、この関数が最初にアクセスされたときに返される値が作成されます.これは防弾設計です.GetInstance()以降の呼び出しはすべて同じインスタンスのポインタを返します.
ポインタsおよびs 2は、同じ一意のインスタンスを指す.
単一クラスCSingletonには、次のような特徴があります.
一意のインスタンスを指す静的ポインタm_があります.pInstanceは、プライベートです.
この一意のインスタンスを取得し、必要に応じてインスタンスを作成する共通の関数があります.
そのコンストラクション関数はプライベートであり、クラスのインスタンスを別の場所から作成することはできません.