免責事項:ここではJava用語で話しています
シングルトンは、アプリケーション全体でデータを共有するための迅速かつ便利な方法であるため、最近頻繁に悪用されているため、アンチパターンと見なされるようになりました。これは、共有リソースへのアクセス制御を提供するのにより適した設計パターンの拡張です。 .
プログラムの標準出力を検討してください。そのリソースへのアクセスは、書き込みの同期を可能にするために単一のアクセスポイントによって保護される必要があります。そのため、たとえば System.out を java.
問題は、シングルトンを使い始めると、自分がやっていることのすべての核心的な詳細を知る必要があるということです.シングルトンクラスについて多くの厳密な仮定をしているため、最も重要なのはそれが唯一のものになるということです.システム内のクラス。次に、それが常にリソースへの単一のエントリ ポイントであると想定して使用を開始すると、厄介なバグが発生します。これは、クラスが ejb サーバーにデプロイされ、各 ejb コンテキストに独自のシングルトンがあり、さらにもう 1 つのシングルトンがあるためです。サーバーからリロードされたすべての jsp に加えて、シングルトンがシリアライズおよびデシリアライズされるたびに 1 つのシングルトン (おそらく readResolve() メソッドをオーバーライドするのを忘れているため)。
そのため、シングルトンは細心の注意を払って使用する必要があり、意図した用途には完全に役立つにもかかわらず、現在ではアンチパターンと見なされています。
データベース キャッシュの場合は、この「キャッシュ」リソースのプロキシを使用してキャッシュを必要とする各クラスを用意する方がよいため、代わりにプロキシ自体に「リソースを検索する」ロジックを追加できます。ロジックをキャッシュシングルトンの取得に関連付けることができます。これは、環境によって機能する場合と機能しない場合があります。
したがって、リソースへの共有アクセスを行う手段としてシングルトンを使用することは悪いことです。リソースを見つける方法をハードコーディングしている(そしてシングルトンの落とし穴を無視している)ため、同期目的でリソースを制御するシングルトンを使用することは完全に受け入れられます。
セマフォについて考えてみてください。これらは、常に同じセマフォを取得できる場合にのみ機能します。この後者の場合、問題になる可能性があるのは、そのセマフォにアクセスする必要があるすべての場所からシングルトンにアクセスすることです。ここでは、シングルトンをラップして、セマフォ自体のライフサイクルをより細かく制御するクラスが必要になります。
プロキシは、単一のアプリケーション、クライアントサーバーシステム、同じシステムのさまざまなコンポーネントなど、「システム全体にリソースを提供する」という役割をカバーすることを目的としています。リソースは不透明です。キャッシュされた値のハッシュマップを含むシングルトンを提供する、ネットワーク上のどこかで memcached にアクセスする、テスト中に csv を読み取る、アプリケーションからそれらを呼び出す方法をすべて変更することなく提供することができます。