Singleton パターン

Singletonとは

  • 生成に関するデザインパターン
  • GoFによって定義されたデザインパターンのひとつ

要点

  • コンストラクタはprivateで宣言し、クラス外から呼び出せなくする
  • 代わりにインスタンスを取得するためのstaticメソッドgetInstanceを定義する
  • getInstanceメソッドは、既存のインスタンスがあればそれを返す 既存のインスタンスがなければ新規に生成して返す

応用、派生

インスタンスの再利用

イミュータブルなクラスについて、同じデータが生成される頻度が高い場合はSingletonをベースに生成処理を作成すればメモリ効率が良くなると思われる。
また、Stateパターンもメンバを持たないクラスのインスタンスを扱うので、再利用が可能。

インスタンス数の制限

生成処理をちょっと変更すれば、インスタンスの数を一定の上限までに制限できる。
Webブラウザなどで「最大接続数」ってあるけど、Singletonをベースにしたらうまく実装できたりしないかなーと思った。
もしかしたらやってるんだろうか。いつかソースコードを読んでみたい。

グローバル変数

どこからでもインスタンスを取得・操作できるため、グローバル変数として使うことができる。
ほとんどのメソッドに引数として渡さなければならないクラスがある場合、Singletonを使えばシンプルにできると思われる。
ただし、本質はやっぱりグローバル変数なので多用すべきではない。

マルチスレッド環境での利用

マルチスレッド環境で使う場合は、インスタンスが既に生成されているかどうかを気にする必要がなくなる。
ただし、イミュータブルでない場合はsynchronized化が必要なのでオーバーヘッドは増える。

生成タイミングをずらせる

Singletonでは生成タイミングをできるだけ遅らせ、必要になった時点で生成する。
したがって「最初にインスタンスを生成しておいたけど結局使わなかった」というようなことは起こらず、メモリの節約になる。
また、最初にまとめて初期化する場合に比べてインスタンス生成のタイミングを分散させることができるので、負荷集中を減らせる可能性がある。
ただ、後者についてはあくまで副次的なものと考えたほうがいいかな。
意図したタイミングにずらせるわけではないので。

所感

使い所がちょっと難しいけど、知っておいて損はないパターンだと思う。
一番効果を実感できるのはStateパターンかなーと思った。

関連記事


  1. Open Session in Viewは使用すべきなのか?
  2. イミュータブルオブジェクト
  3. Strategy パターン
  4. Factory Method パターン
  5. Template Method パターン
  6. rmコマンドとmvコマンドの事故に備えた安全な使い方
  7. 圧縮アルゴリズム勉強メモ

comments powered by Disqus