web-dev-qa-db-ja.com

プログラミングにおけるシングルトンの目的

これは確かにかなり緩い質問です。シングルトンについての私の現在の理解は、シングルトンは、インスタンスが1つだけ作成されるように設定したクラスであるということです。

これは、静的クラスのように思えます。主な違いは、静的クラスではインスタンス化できない/インスタンス化できないことです。Math.pi()のように使用するだけです。シングルトンクラスでも、次のようなことをする必要があります

singleton firstSingleton = new singleton();
firstSingleton.set_name("foo");

singleton secondSingleton = new singleton();

私が間違っていれば私を訂正しますが、firstSingleton == secondSingleton今、そうですか?

secondSingleston.set_name("bar");
firstSingleton.report_name(); // will output "bar" won't it?

注意してください、私はこの言語について独立して、コンセプトについてもっと質問しています。だから私は実際にそのようなクラスをどのようにコーディングするかについて心配していませんが、なぜあなたがしたくないのか、そしてあなたが何を考慮する必要があるのか​​については心配していません。

51
thecoshman

Staticで構成されるクラスに対するシングルトンの主な利点は、後で実際に複数のインスタンスが必要であると後で簡単に判断できることです。スレッドごとに1つ。

ただし、実際には、シングルトンの主な目的は、グローバル変数を持つことに人々がそれほど気分を害しないようにすることです。

goodのシングルトンの実用的な例:SQLデータベースを使用するアプリがあり、接続プールが必要です。このようなプールの目的はDB接続を再利用することなので、すべてのクライアントが確実に同じプールを使用するようにします。したがって、それをシングルトンとして持つことは正しい設計です。しかし、ある日、アプリがsecond DBサーバーに接続する必要があり、同じプール内の異なるサーバーに接続できないことに気付きました。したがって、「1つのインスタンス全体」のシングルトンは「DBサーバーごとに1つのインスタンス」になります。

52

なぜあなたはしたくないのですか

シングルトン通常は問題を解決するのに非常に悪い方法なので、私はそうは思いません。あなたへの私の推薦はそれらを完全に避けることです。

主な理由は次のとおりです。

  • シングルトンは、主にグローバルな状態(これは悪です)を表します。
  • 正しい依存性注入は不可能になります。

このGoogle社員のブログの残りの部分(詳細な説明を含む)を読むことをお勧めします。

13
balu

他の人が言ったように:

  • シングルトンは別の名前のグローバル変数です。
  • シングルトンは通常悪い考えです。
  • シングルトンcould「モノステート」クラスに置き換えられます-明らかに正常な構築/破壊セマンティクスを持つが、すべて同じ状態を共有するクラス。

私の見解では、「静的クラス」は通常also悪い考え、自由な関数を許可しない言語、またはそれを渡さずに関数の束の間で状態を共有するためのハックな回避策であることに注意してくださいパラメータとしての状態。

私の経験では、シングルトンまたは静的クラスを持つほとんどすべての設計は、これらの構成要素を取り除くことによって、より良い、より簡単に理解され、より柔軟なものに変えることができます。

編集:リクエストにより、ほとんどのシングルトンが別の名前のグローバル変数である理由。

私が知っているほとんどの言語では、ほとんどのシングルトンクラスは、そのクラスの静的メンバー関数を介してアクセスされます。単一インスタンスは、シングルトンクラスの定義にアクセスできるすべてのコードで使用できます。これはグローバル変数です。クラスを含むすべてのコードが、シングルトンの単一のインスタンスに変更を加える可能性があります。
静的メンバー関数(または同じ意味を持ついくつかの静的ファクトリーメソッド)を使用せずに、シングルトンオブジェクトを必要とするすべてのクライアントにシングルトンオブジェクトを渡す場合、シングルトンパターンは必要ありません。 、同じオブジェクトをすべてのクライアントに渡すだけです。

3

少しの知識は危険なものであり、シングルトンは危険な存在です。上記の記述に加えて、シングルトンオブジェクトの寿命管理も重要です。 ACEフレームワークでは、正常に処理されます。論文はここにあります: http://www.cs.wustl.edu/~schmidt/PDF/ObjMan.pdf

シングルトンはコピー不可能なクラスでなければならないことにも注意してください。このパターンが最も簡単に見えるかもしれませんが、逆に難しいパターンの1つです。したがって、私は候補者にシングルトンのこの悪い点について尋ねます。

2
baris.aydinoz

シングルトンは、シングルトンサービスへのインターフェースが必要な場合にほとんど役に立ちますが、インスタンス化される具体的なクラスが実行時になるまでわかりません。

たとえば、集中ログサービスを宣言し、実行時にファイルロガー、スタブロガー、データベースロガー、またはメッセージキューロガーをフックするかどうかのみを決定したい場合があります。

2
Marcelo Cantos

他の回答に加えて、静的クラスが必要な場合にシングルトンが役立つことはありますが、アプリケーションの設計によりインスタンス化可能なクラスを継承するため、それができないと言う必要があります。

0

シングルトンを使用するには2つの方法があります。

  1. それらの使用方法。通常は不変変数(C#のString.Empty、Smalltalkのクラスなど)を使用します。これは、シングルトンの使用量の約1%です。
  2. グローバル変数の代わりとして。これは悪いです。これの根本的な原因は、ビルダーを適切に使用する方法を理解せずに一般的なオブジェクトを共有したい人々です。この方法でシングルトンを使用することは、通常、オブジェクト指向の設計を深く理解していないことを示しています。
0
kyoryu