閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

Monostate パターン

アプリケーションの色々な箇所で使用する設定を構造体なりクラスなりにまとめて保持させたときに、設定は常にひとつだけにして、どこかでとある設定に変更が加えられたら別のところで参照している設定にもその変更を反映させたい、とする。

こういった時には、設定を保持する構造体を Singleton にしてインスタンスをひとつに保つ方法もありますが、 Monostate パターンを使うのも便利です。 Monostate は、インスタンス自体はいくらでも作成することができますが、内部で保持するデータは全て静的メンバとして宣言するため、結果として全ての Monostate クラスのインスタンスが保持する値は同じものにすることが可能です。

Singleton と比較して、使う側から見ると使い勝手は良さそうな感じです。いま設計しているところに取り入れてみる予定。

Monostate を C++ で実装すると以下のような感じになります。かなり単純ですが……その分簡単。

#include <iostream>
using namespace std;

struct monostate
{
    static int param;
};
int monostate::param = 0;

void f()
{
    monostate m;
    cout << m.param << endl;
}
void f2()
{
    monostate m;
    cout << m.param << endl;
}
void param_set123()
{
    monostate m;
    m.param = 123;
}
int main()
{
    f();
    f2();
   
    param_set123();

    f();
    f2();
   
    return 0;
}