Singleton

最終更新日19 Jul 2017 04:48

定義

あるクラスに対して、インスタンスが一つしかないことを保証し、それにアクセスするためのグローバルな方法を提供する。[1]
私、これやってるかも。
クラスがインスタンスを1つしか持たないことを保証し、そのインスタンスをアクセスするグローバルポイントを提供する[2]
英語の意味はトランプで 1 枚札(の手).という意味である

なぜこのパターンを使用するか?

グローバル変数ならぬ、グローバルクラスのように扱えて便利である。

このパターンの使いどころ

あるプログラムにたった一つしか存在しなくていいクラスに使う

このパターンに必要な材料

各材料の役割・関係

使う理由・シングルトンの利点

  • 環境中に一個しか存在しないオブジェクトについての排他制御を行うため。

プリンタなど、一個しか存在しないけど、複数の人がアクセスするようなオブジェクトの場合に使う。
占有ユーザ以外にインスタンスを与えない。[3]

  • 不必要に重複したオブジェクトの生成を回避する[4]

つまり、
一つの資源だけど複数のクラスから使いたい場合に有効な手法。

実装する方法

  1. シングルトンにしたいクラスのコンストラクタをprivateにする。
  2. 使う側がそのクラスの唯一のインスタンスにアクセスできるようなpublic staticのメンバーを提供する。

シングルトンを作るにはstaitcなfatcoryメソッドを使ってつくると良い[4]

このパターンが実際に使用されている例

このパターンの見つけ方は

public static final クラス名 SINGLETON=new クラス名();

static final修飾子がついていて型がクラスだったらシングルトンだ

関連パターン

具体例

Singleton.h

class Singleton
{
private:
      static Singleton* sInstance;
public:
    static Singleton* getInstance();  // インスタンスの取得
    void print();// staticじゃないメンバクラス。getInstance()経由で呼び出す
    }

Singleton.cpp
Singleton *Singleton::sInstance = nullptr;
Singleton* Singleton::getInstance()
{
       if(!sInstance) sInstance = new Singleton();
    return sInstance;
}
世界に一人しかいないキム・カーダシアンのクラスを作ります。

シングルトンクラスの使い方・呼び出し方

じゃあ、その世界に一人しかいないキムを呼び出すにはどうしたらいいか?
こうします
Singletono::getInstance()->print();

すると、彼女は楽屋でこっそりお化粧をしてから登場します。

preparing her face
Hi, I'm Kim Kardashian

シングルトンパターンをクラステンプレートにして登録しておく

http://www.slideshare.net/shinnosukekugimiya/ss-42344878


ファイル

サポートサイト Wikidot.com