- ドメインが、モデル化しているものの一意のインスタンスが 1 つだけ存在することを指定している場合
シングルトンは避けるべきだと今でも信じています(少なくともJavaでは)。
考慮すべき点が 2 つあります。Singleton パターンを適用するための概念とメカニズムです。
シングルトンの概念には多くの用途、ロギング、構成があり、作業しているドメインに実際にそれらのインスタンスが 1 つしかないものがあり、それをモデル化したい場合は言うまでもありません。つまり、会社には単一の経費処理オフィスしかなく、経費フォームを無効なオフィスに送信するのは間違っています。オフィスは実際にはシングルトンです。シングルトンの概念には、多くの正当な用途があります。
ただし、通常、問題を引き起こすのはメカニズムです。Java では、constructor を宣言することによってオブジェクトを構築できないように強制しますprivate
。これに関する問題は、具象クラスを介してインスタンスへのグローバルなアクセス ポイントも提供する必要があることです。これにより、アプリケーション内のすべてが具体的なクラスに結合されます。これは、実行時に変更したり、単体テストでモックしたりすることはできません。特にテスト容易性の観点から、悪と見なされるのはこのメカニズムです。
シングルトンの概念を貧弱なメカニズムから切り離すことができれば、それほど悪くはありません。@Singleton
1 つの例として、 Guice で使用できるスコープが考えられます。Guice のコンテキストでは、1 つのインスタンスが保証されますが、悪意のあるプライベート コンストラクター/グローバル ポイント オブ アクセス メカニズムではこれを実現できません。