Singleton(ちょうぜつ本)
ひとつのクラスのインスタンスがたったひとつしかない形を取るためのパターン (Kindle版 pp.340-341)
典型的な実装(getInstance)
二度目以降の呼び出しでは、クラスの静的プロパティに保持されたインスタンスが返されます。(Kindle版 p.341). .
シングルトンが有効なのは、たとえば現在時刻を指す時計や数学関数セットなど、普遍的に世界にひとつしか存在しないものを実装するとき (Kindle版 p.344)
ビジネスロジックではめったに登場しない
本質的にグローバル変数
書き込み可能だったり、内部状態を持ったりするのはNG
参照透過性を持たない(のでNG)
同じメソッドを同じ引数で呼び出したとき、常に同じ結果が担保されているような特性のことを、参照透過性があると言います。(Kindle版 p.345). .
シングルトンインスタンスは引数以外にユーザー入力がない
スタティックメソッドと同じ
インターフェースに依存する関数では、渡されたインスタンスがシングルトンかは知らなくても使える
スタティックメソッドに依存するとクラスに直接依存してしまう
シングルトンが必要ならクラスよりDIコンテナを選ぼう (見出し)
コンストラクタパラメータを持てる
テストの容易性につながるのも1つ
本来の Singleton とは、人類のどの言語で言い表しても偏在する概念が、つねに単体で、不変な形として、擬似的に存在を得たもの
ファイルシステムのルートだとか、標準入出力なんかは、Singleton とみなしてもオッケーです。
Singleton は、初回の取得でいちど初期化されると、二度目以降は必ず同じインスタンスを返します。
異なるプロセスとして起動された場合でも、基本的には再度、等価なオブジェクトが得られるはず
単一インスタンスを共有していて、その必要条件はイミュータブルである
(ビジネスロジックから見た)バーチャルSingleton
DIコンテナ
本来、シングルトンは生成にパラメーターを取りません。
さらに多くの人が誤解しているのは、アプリケーション全体で共有するコンテキストのことを Singleton と呼んでしまうことです。それただのグローバル変数だから。