【しんぐるとんぱたーん】

シングルトンパターン とは?

最終更新:
💡 同じ一つのインスタンスを、決めた範囲で共有する

クラスのインスタンス生成を制御し、同じ一つのインスタンスへアクセスさせるデザインパターン。共有される範囲は実行環境や実装で決まり、全サーバーを通じて一つになる仕組みではない。

📌 このページのポイント
別々に作る場合と、一つを共有する場合別々のインスタンス一つを共有取得1物1取得2物2取得3物3同じ物取得1取得2取得3図の共有範囲は、一つの管理範囲の例別サーバーまで一つ・同時利用が安全とは限らない
左右は生成・取得方法の比較で、普通に複数作ることが失敗という意味ではありません。右の緑は共有する同じ対象、矢印は取得する対象を示します。
ひよこ ひよこ
なんで1つだけにするの?
ペンギン先生 ペンギン先生
同じサービスや設定を共有したいとき、生成を制御して同じインスタンスを取得させるためだよ。ただしロガーや接続プールは常に一つしか作れないものではない。何を、どの範囲で共有する必要があるかを先に考えよう
ひよこ ひよこ
世界に1つだけになる?
ペンギン先生 ペンギン先生
別プロセスや別サーバーまで一つになるわけではないよ。例えばJavaのGoFパターンではクラスローダーの範囲を考え、Springのsingletonスコープは管理機構とBean定義ごとに一つ。分散したシステム全体で一つだけにするには別の仕組みが必要なんだ
ひよこ ひよこ
どうやって使うの?
ペンギン先生 ペンギン先生
生成を制限し、同じ保存済みのインスタンスを返す取得口を用意する考え方だよ。DIの管理機構に共有範囲を管理してもらう方法もある。ただしDIのsingletonスコープと、クラス自身が生成を制御するGoFパターンは、管理する場所や範囲が違うね
ひよこ ひよこ
1つだけなら、同時に使っても安全?
ペンギン先生 ペンギン先生
そうとは限らないよ。一つの共有オブジェクトへ複数の処理が同時に書き込むなら、排他制御などの設計が必要。DIの管理機構が安全に生成してくれても、作られたサービスの中身まで自動で安全になるわけではないんだ
ひよこ ひよこ
テストにも影響する?
ペンギン先生 ペンギン先生
共有する状態があると、別のテストや要求に影響が残ることがあるよ。どこからも直接取得できる形では依存関係も見えにくい。必要な相手を引数やDIで渡し、差し替えや寿命を管理する方法を検討しよう。どんな対象でもsingletonにすればよいわけではないね
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「シングルトンパターン」って出てきたら「同じ一つのインスタンスを共有するためのパターン」と思えばだいたいOK!
📖 おまけ:英語の意味
「Singleton Pattern」 = シングルトンパターン
💬 Singleton(一人っ子、唯一のもの)。インスタンスが「一人っ子」になるパターンだよ

参考資料

← 用語集にもどる