1. ホーム
  2. design-patterns

[解決済み] なぜSingletonはアンチパターンと言われるのか?重複

2023-02-01 03:44:01

疑問点

重複の可能性があります。

シングルトンの何がそんなに悪いのですか?

シングルトンデザインパターン。落とし穴

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

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

なぜシングルトンはアンチパターンと見なされるのでしょうか?また、その代替案は何でしょうか?

どのように解決するのでしょうか?

回答に役立つように、アンチパターンのコメントについて詳しく説明します。

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

からです。 http://en.wikipedia.org/wiki/Singleton_pattern

これについては、以下をご覧ください。 https://www.michaelsafyan.com/tech/design/patterns/singleton

上記のブログの素晴らしい結末をご紹介します。

要するに、シングルトンパターンはコードをより複雑にし、有用性を低下させるのです。 そして、再利用やテストが本当に苦痛になります。シングルトンを排除することは しかし、それは価値のある努力です。

なるほど、アンチパターンである理由はこの段落によく書かれていて、著者が表現しているように、コードをシングルトンに強固に結合してしまうのですね。

シングルトンを使いたいということがわかったら、設計を検討したほうがいいかもしれませんが、便利な場合もあります。

たとえば、かつて私は、何千ものリクエストを処理するために、せいぜい1つのデータベース接続を持つことができるアプリケーションを書かなければなりませんでした。 そのため、1つのインスタンスしか持てないというリソースの制約があるため、シングルトンは理にかなっています。

しかし、一般的に、これはコードを単純化するために使用され、導入される難しさについては考えません。

例えば、これは静的クラスにも当てはまりますが、ユニットテストや並行処理がある場合、あるリクエストの状態が変更され、インスタンスを呼び出すクラスが状態が期待通りであると仮定するため、問題が発生する可能性があります。

使い方にチャレンジするのは、プログラムがマルチスレッドになった場合の処理を考えることだと思いますが、簡単な方法としては、一度に複数のテストを実行するのであれば、ユニットテストを行うことだと思います。

それでも必要だとわかったら、使うが、後で発生する問題を認識することだ。