「C++のデザインパターン - シングルトン」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == <br><br> == サンプルコード == 以下の例では、コンストラクタは<code>private</code>で隠蔽して、<code>new</code>の代わりにSingleton::getInstanceメソッドでインスタンスを取得する。<br> privateメンバ変数static Singleton* instanceで自身のインスタンスのポインタを保持している。<br> <br> クラス外部で、Singleton* Singleton::instance = 0;により、自身のインスタンスの…」)
(相違点なし)

2023年1月28日 (土) 23:52時点における版

概要



サンプルコード

以下の例では、コンストラクタはprivateで隠蔽して、newの代わりにSingleton::getInstanceメソッドでインスタンスを取得する。
privateメンバ変数static Singleton* instanceで自身のインスタンスのポインタを保持している。

クラス外部で、Singleton* Singleton::instance = 0;により、自身のインスタンスのポインタを初期化している。

 // Singleton.h
 
 #ifndef SINGLETON_H
 #define SINGLETON_H
 
 class Singleton
 {
 private:
    // シングルトンのインスタンス生成にはgetInstanceメソッドを使用するため、コンストラクタを隠蔽する
    Singleton()
    {
       std::cout << "Singleton instance created" << std::endl;
    }
 
    // インスタンスのポインタ
    static Singleton* m_Instance;
 
    int m_Data = 1;
 
 public:
    // インスタンスを取得するメソッド
    static Singleton* getInstance()
    {
       // インスタンスが存在しない場合は生成する
       if(m_Instance == NULL)
       {
          m_Instance = new Singleton();
       }
 
       return m_Instance;
    }
 
    int getData()
    {
       return Singleton::getInstance()->m_Data;
    }
 
    void setData(int data)
    {
       Singleton::getInstance()->m_Data = data;
    }
 };
 
 // インスタンスのポインタを初期化
 Singleton *Singleton::m_Instance = nullptr;
 
 #endif


上記のクラスの使用手順を、以下に示す。

 #include <iostream>
 #include "Singleton.h"
 
 int main(int argc, char* argv[])
 {
    // インスタンスAを生成
    Singleton* InstanceA = Singleton::getInstance();
    std::cout << "インスタンス1のアドレス: " << InstanceA << std::endl;
 
    // 別のインスタンスBを生成
    Singleton* InstanceB = Singleton::getInstance();
    std::cout << "インスタンス2のアドレス: " << InstanceB << std::endl;
 
    // 各インスタンスのメソッドを呼び出す
    std::cout << "インスタンスAのdata: " << InstanceA->getData() << std::endl;
    std::cout << "インスタンスBのdata: " << InstanceB->getData() << std::endl;
 
    // インスタンスAの保持データを更新する
    std::cout << "インスタンスAのメンバ変数を10に更新" << std::endl;
    inst1->setData(10);
 
    // 各インスタンスのメソッドを呼び出す
    std::cout << "インスタンスAのdata: " << inst1->getData() << std::endl;
    std::cout << "インスタンスBのdata: " << inst2->getData() << std::endl;
 
    return 0;
 }


# 出力例
インスタンスAのアドレス: 0x9045kd9s
インスタンスBのアドレス: 0x9045kd9s
インスタンスAのdata: 1
インスタンスBのdata: 1
インスタンスAのメンバ変数を10に更新
インスタンスAのdata: 10
インスタンスBのdata: 10