96

重複の可能性:
シングルトンの何がそんなに悪いのですか?

シングルトン設計パターン: 落とし穴

シングルトンアンチパターン

最近、Singleton はアンチパターンだと聞きました。クラスシングルトンを作成することは、その一意のインスタンスをグローバル変数にするようなものであるという事実に関係していることは知っていますが、それ以上のことも行っています(そのオブジェクトのインスタンス数の制限、インスタンス化の管理など..)。

シングルトンがアンチパターンと見なされるのはなぜですか? そして、代替手段は何ですか?

4

4 に答える 4

85

回答に役立つように、アンチパターン コメントの詳細を次に示します。

過度に使用され、クラスの唯一のインスタンスが実際には必要ない状況で不必要な制限を導入し、アプリケーションにグローバルな状態を導入します

出典: http://en.wikipedia.org/wiki/Singleton_pattern

詳細については、https ://www.michaelsafyan.com/tech/design/patterns/singleton を参照してください。

上記のブログのすばらしい結末は次のとおりです。

要するに、シングルトン パターンはコードをより複雑にし、有用性を低下させ、再利用やテストを非常に困難にします。シングルトンを排除するのは難しいかもしれませんが、それは価値のある努力です。

さて、それがアンチパターンである理由はこの段落で詳しく説明されており、著者が表現しているように、コードをシングルトンに密結合させます。

シングルトンを使用したい場合は、設計を検討することもできますが、便利な場合もあります。

たとえば、数千のリクエストを処理するために、最大で 1 つのデータベース接続を持つアプリケーションを作成しなければならなかったことがあります。したがって、インスタンスが 1 つしかないというリソースの制約があるため、シングルトンは理にかなっています。

しかし、一般に、これはコードを単純化するために使用され、導入される問題を考慮しません。

たとえば、これは静的クラスにも当てはまります。単体テストを行う場合、または同時実行性がある場合、1 つのリクエストの状態によって状態が変化し、インスタンスを呼び出すクラスが状態をそのまま想定している可能性があるため、問題が発生する可能性があります。期待される。

使用に挑戦する最善の方法は、プログラムがマルチスレッドである場合にそれを処理する方法を考えることだと思います。それを行う簡単な方法は、一度に複数のテストを実行する場合は単体テストを行うことです。

それでも必要な場合は使用しますが、後で発生する問題を認識してください。

于 2012-10-06T00:22:43.870 に答える
29

シングルトンをアンチパターンとは正確には考えていません。

ただし、シングルトンは基本的にグローバル変数を使用する方法です。また、システム内の任意のコードが値を変更できるため、グローバル変数は良くありません。そのため、デバッグ時に、シングルトンの現在の状態につながるコード パスを特定するのは難しい場合があります。

于 2012-10-06T00:14:59.133 に答える
9

Singleton クラスは他のオブジェクトによって通常の方法でインスタンス化できないため、アンチパターンと見なされると思います (一般に「getInstance」という名前のメソッドを呼び出す場合を除く)。そのため、最初に使用可能なオブジェクトを作成するためにクラスをインスタンス化せずに、クラスが直接使用されているように見えます。

シングルトンがグローバルでユニークなインスタンスとして機能できることに同意します。シングルトンの代替として、静的および/または最終変数を使用できること、および列挙型を使用できることを何人かの人々から学びました (これにより、複数の変数を 1 つのグループ名でグループ化して、通常のクラス/オブジェクト)。

ただし、これらの代替手段は、状態/値を格納する際に Singleton クラスの機能と一致するだけです。独自の関数を使用する必要がある場合、これらの static/final 変数と列挙型は役に立ちません。私の意見では、Singleton クラスを使用する必要がある場合 (静的/最終状態/値を操作するために独自の関数が必要な場合) がこれに当てはまります。

乾杯... :))

于 2012-10-06T00:38:21.797 に答える
9

多くの場合、シングルトンは適切に実装されていません。double-checked-locking を参照してください。

Singleton インスタンスが一意である必要があるスコープ。マルチスレッド環境、クラスタリングなどのように。

シングルトンはテストが難しい場合があります。

シングルトンに割り当てられたメモリは解放できません。

シングルトンを過度に使用すると、オブジェクト指向プログラミングから手続き型プログラミングに移行します。

于 2012-10-06T00:24:19.213 に答える