Singleton

singleton.png

Singletonという名前のお酒もあります。スコッチだそうです。

定義

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

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

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

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

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

クラス図

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

各材料の役割・関係

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

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

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

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

実装する方法

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

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

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

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

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

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

関連パターン

具体例

KimKardashian.h

/**
 * @brief キム・カーダシアンのクラス (Singleton Pattern)
 */
class KimKardashian
{
public:
    static KimKardashian* GetInstance();  // インスタンスの取得
    void print();// staticじゃないメンバクラス。GetInstance()経由で呼び出す
    }

KimKardashian.cpp
/**
 * @brief KimKardashianのインスタンスを生成
 * @return KimKardashianのインスタンス
 */
KimKardashian* KimKardashian::GetInstance()
{
    static KimKardashianinstance;
    return &instance;
}
世界に一人しかいないキム・カーダシアンのクラスを作ります。

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

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

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

preparing her face
Hi, I'm Kim Kardashian

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

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

サポートサイト Wikidot.com