5

重複の可能性:
静的クラスとシングルトン パターンの違いは?

なぜ 1 つだけのインスタンスが必要になるのでしょうか? 静的メンバー変数と静的メソッドを持つクラスを使用して、同じ目的を達成できます。

私が知る限り、それには2つの可能な答えがあるかもしれません-

  1. クラスに状態が必要で、そのオブジェクトを 1 つだけ必要とする場合。設計の観点から、静的メソッドと変数を持つクラスはユーティリティ クラスと見なされ、状態を保持するべきではありません。

  2. クラスがポリモーフィズムに参加する必要があり、継承ツリーにあるクラスの 1 つのオブジェクトのみが必要な場合。

誰かが実際のシナリオから、またはシングルトンオブジェクトがポリモーフィズム/継承に参加する必要がある Java API から例を提供できれば、本当に役に立ちますか?

4

4 に答える 4

2

Collections.emptySet()は、静的クラスとして実装できないシングルトンの典型的な例です。明らかに、その目的はjava.util.Setインターフェースのインスタンスになることだからです。作成にコストはかかりませんが、一意のインスタンスを再利用できるため、空のセットが必要になるたびに新しいインスタンスを作成するのはばかげています。

于 2012-10-07T17:12:39.187 に答える
1

ロギングまたはデータベースへの共通アクセスを実行するクラスは、シングルトンパターンに従うことがよくあります。基本的に、インスタンスメソッドが必要で、構築にコストがかかるものはすべて。

于 2012-10-07T15:41:17.600 に答える
0

私の答えはかなり短いですが、静的な実装ではなく、正確に共通のシングルトンを使用するだけで十分です。答えは次のとおりです。

  • 人気のあるパラダイム (そうです!)
  • スレッド (同期など)
  • インターフェイスの実装 (静的クラスにはいくつかの制限があります)
于 2012-10-07T17:34:17.193 に答える
0

スコープと動作は異なる問題であり、混在させるべきではありません。オブジェクトを、使用ごと、スレッドごと、Web リクエストごと、セッションごと、またはグローバル (Singleton) ごとに使用できるようにすることができます。これらの調整を行う理由は、リソース管理と最終的にはパフォーマンスのためである可能性があります。スコープを変更しても、クラス内の動作を変更する必要はありません。

Singleton は、通常のオブジェクトを取り、そのスコープをほんの少しのボルトオン コードで制御するためのパターンです。ただし、理想的には、オブジェクト内でスコープをまったく処理せず、それをファクトリまたはコンテナーに委任する必要があります。

于 2012-10-07T17:35:42.230 に答える