【しんぐるとん】

シングルトン とは?

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

クラスのインスタンス生成を制御し、同じ一つのインスタンスへのアクセスを提供するデザインパターン。一つになる範囲は実行環境や実装によるため、複数プロセスやサーバーをまたぐ唯一性は別途管理する。

📌 このページのポイント
同じ1個のインスタンスを共有 同じクラス・実行環境での例 利用側1 利用側2 利用側3 取得窓口 getInstance() 同じものを 返す 1個 別プロセスまで1個になる保証はない
矢印は取得と参照の関係です。生成の競合や共有状態の更新には、それぞれ必要な制御を用意します。
ひよこ ひよこ
シングルトンって何のためにあるの?
ペンギン先生 ペンギン先生
同じ一つのオブジェクトを共有するためだよ。クラスのインスタンス生成を制御して、利用側が同じものを取得できる窓口を用意するんだ。例えば設定の読み取りをまとめる用途が考えられるね。
ひよこ ひよこ
どうやって一つにするの?
ペンギン先生 ペンギン先生
Javaの代表例では、コンストラクタをprivateにし、クラスがstaticフィールドにインスタンスを持ってgetInstance()で返すよ。最初の呼び出しで作る場合は、同時に呼ばれて二つ作らないように制御も必要なんだ。
ひよこ ひよこ
複数のサーバーでも一つだけになる?
ペンギン先生 ペンギン先生
それだけではならないよ。別のプロセスやJavaの別のクラスローダーには、それぞれのインスタンスがあり得る。一つという保証がどの範囲のことかを、実装と実行環境に合わせて確認しよう。
ひよこ ひよこ
共有すれば状態のズレもなくなる?
ペンギン先生 ペンギン先生
同じものを参照できても、同時に状態を書き換える競合は起こり得るよ。また共有状態がテストへ残ったり、直接getInstance()を呼ぶ設計だと別の実装へ差し替えにくかったりするんだ。
ひよこ ひよこ
テストしやすくするには?
ペンギン先生 ペンギン先生
利用側へ必要なオブジェクトを外から渡す、依存性の注入を検討できるよ。一つのインスタンスを共有するかという寿命の管理と、利用側がどう取得するかは分けて考えられる。DIコンテナが共有インスタンスを管理する方式もあるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「シングルトン」って出てきたら「決めた範囲で同じ1個のインスタンスを共有するパターン」と思えればだいたいOK!
📖 おまけ:英語の意味
「Singleton」 = 一つだけのもの
💬 同じ一つのインスタンスを使う、という意味と結び付けると覚えやすいね

参考資料

← 用語集にもどる