ホームに戻る
出典 :
関連 :
目次 :
シングルトン(Singleton)とは
オブジェクト指向プログラミングにおけるデザインパターンの一つで、そのクラスのインスタンスが一つしか生成されないことを保証する仕組みのこと。
インスタンスが一つであることが必要且つ十分で、アプリケーション全体で統一しなければならない仕組みの実装に用いられる。
シングルトンの一般形

上図は一般的なシングルトンのクラス図である。特徴は以下の通り。
- インスタンスを 自身の中に static メンバとして保持する
- コンストラクタを private 化する ⇒ クラス外からのインスタンス生成を許容しない
- 1. のインスタンスを返す getInstance() 関数を有する(public かつ static)
これにより、シングルトンのインスタンスが唯一であることが保証され、クラス外からはインスタンスを生成することなく(そもそも生成できない)利用できる。
C++での実装例
C++03以前

getInstance() 関数の静的ローカル変数をシングルトンインスタンスとしている。ここでコピーコンストラクタ、コピー代入演算子を private かつ定義無しとしているのは、 クラスを(実質的に)コピー不可とする ため。
注意が必要な点として、C++03以前の規格では静的ローカル変数の初期化はスレッドセーフ性が保証されないため、複数のスレッドから同時に初回の getInstance() が呼ばれた場合、未定義の動作となる。
また、シングルトンインスタンスを削除するタイミングを明示的に制御できない点にも注意が必要。さらに、Singleton クラスを継承した派生クラスの定義を制限することができない。
C++11以降

delete 指定によりコンパイラがデフォルトの関数を生成しない(明示的に「定義無し」とする)ようにできる ため、コンストラクタ・デストラクタ以外は private である必要は無い。
旧規格と異なり、静的ローカル変数の初期化は自動的にスレッドセーフとなる。また、final 指定により、派生クラスの定義を禁止することができる。
シングルトンを適用するケース
プログラム(ソフトウェアコンポーネント)中でインスタンスが唯一であることが保証されるため、プログラム中で(値の)同期が必要となる用途に適する。具体的には
- 設定ファイル(INI、XMLなど)から読み込んだ設定値を管理する
- DLLのラッパー
などが挙げられる。
(これらはプログラム中で唯一であるとともに、特定のクラス・文脈に拘束されずにアクセスできることに意義がある。)
シングルトンは特定のクラスや文脈に拘束されないため、一種のグローバル変数のように用いることができる。
逆に言えばグローバル変数と同様の危険性をはらんではいるが、名前空間を用いてアクセス範囲を制限することで、この危険性を低減することができる。