2011-08-09 23 views

答えて

4

クラスがインスタンス化される回数は、クラス自体によって決まるのではなく、単一のインスタンスを提供するインフラストラクチャから決定されるべきです。シングルトンはこの決定をインフラストラクチャに任せることは不可能です。これは再利用性の問題であり、単体テストなどに表示されますが、インフラストラクチャが特定の目的のために別のインスタンスを提供しようとした場合にも表示されます。

(例:そこだけ1つのデータベース接続がある。しかし、別のデータベースからデータをインポートするために、それは別の接続が必要です。データベース・アクセス・サービスはシングルトンになる場合、別の接続をオープンすることは不可能である。)

2

シングルトンパターンは、グローバル状態をアプリケーションに導入するため、単体テストをはるかに難しくします。このパターンは、マルチスレッドコンテキストにおけるシングルトンへのアクセスを、例えばロックによって直列化しなければならないため、プログラム内の並列性の可能性を低減することにも留意されたい。

依存性注入の支持者は、これを主に個人的および静的な方法の使用のために、アンチパターンとみなします。

JavaやPHPなどの言語でのリフレクションなどの方法を使用してシングルトンパターンを分解する方法を提案しているものがあります。

0

理由は、彼らは「はおそらく基本的にはglobal variablesです。それでも、いくつかの環境では非常に幅広く使用されています。たとえば、長時間実行されるWebサービス。 Javaには例えばSpring Frameworkがあり、デフォルトのBeanタイプはシングルトンです。コントローラ、サービス、およびDAOのオブジェクトはシングルトンです(フレームワークがインスタンスを1つだけインスタンス化するという意味で)。それらは、ロックを必要とせず、慣習的にステートを含まないためスレッドセーフでもあります。通常、要求コンテキストが渡され、コントローラ/サービス/ DAOがそれを処理します。

関連する問題