読者です 読者をやめる 読者になる 読者になる

【デザインパターン】Singleton

デザインパターン

どんなもの?

  • あるクラスのインスタンスが一つしかないことを保証する
  • 必要とされたときに初めて初期化される(just-in-time initialization)もしくは初めて使うときに初期化される(initialization on first use)

どんなときに使う?

  • ある一つのアプリに対してあるクラスのオブジェクトを一つだけ作りたいとき

  1. 自身のグローバルポインタ(private static pointer)を持つクラスを作る
  2. そのprivate static pointerにアクセスするメンバ関数を作る。
  3. そのメンバ関数内で初めて使われた時に初期化されるようにする。
  4. Clientはpublic句の付いている関数のみにアクセスする
#include <iostream>
using namespace std;

class GlobalClass
{
  int m_value;
  static GlobalClass *s_instance;
  GlobalClass(int v = 0)
  {
    m_value = v;
  }
public:
  int get_value()
  {
    return m_value;
  }
  void set_value(int v)
  {
    m_value = v;
  }
  static GlobalClass *instance()
  {
    if(!s_instance){
      s_instance = new GlobalClass;
    }
    return s_instance;
  }
};

GlobalClass *GlobalClass::s_instance = 0;

void foo(void)
{
  GlobalClass::instance()->set_value(1);
  cout << "foo: global_ptr is " << GlobalClass::instance()->get_value() << endl;
}

void bar(void)
{
  GlobalClass::instance()->set_value(2);
  cout << "bar: global_ptr is " << GlobalClass::instance()->get_value() << endl;
}

int main()
{
  cout << "main: global_prt is " << GlobalClass::instance()->get_value() << endl;
  foo();
  bar();
}