2012-01-02 5 views
8

私は時々クライアントが照会するものを検索する必要があるサーバーを実行しています。レコードのためにクライアントのクエリをディスクに書きたいと思っていますが、私はこれ以上検索を遅くしたくありません。 (検索はすでにボトルネックになっています...)シングルトンデザインパターンを正しく使用しています

クライアントが検索を実行すると、クライアントのスレッドがシングルトンスレッドにメッセージを送信します。シングルトンスレッドは、クライアントスレッドクライアントの要求を引き続き処理します。この方法では、ディスク上のファイルは同期の問題に陥ることはなく、クライアントの動作が遅くなることはありません。

ここでは概念的な質問があります。この場合、シングルトンは適切ですか?最近のプログラミングでは、シングルトンのデザインパターンを少し使いすぎていましたが、意図した使い方で使用していることを確認したいのです。

ご意見をいただければ幸いです。

+3

全体的なアーキテクチャを見なくてもこの質問に答えるのは難しいです。シングルトンパターンには欠点があります(ユニットテストの難しさなどを引き起こします)。それらが関連しているかどうかを判断するのはあなた次第です... –

+1

Oliの迅速な応答ありがとうございます。私はユニットテストの難しさについて読んだが、全体的な意味を理解していない。そのような重要性の世界的な状態を避けるのはなぜですか?たとえば、プログラムが書き込むディスク上に1つのファイルしかない場合、別の部分で同時にアクセスできないことを確認したくないのですか? – Sal

+0

グローバルな状態が存在すると、依存関係を注入することが難しくなります(これは[模擬テスト](http://en.wikipedia.org/wiki/Mock_object)の基礎です)。詳しくは、http://googletesting.blogspot.com/2008/11/clean-code-talks-global-state-and.htmlをご覧ください。 –

答えて

7

singleton patternは間違いなく過度に使用されており、そのシェアはdifficultiesです(単位テストは標準的な例です)。しかし、設計のすべてのものと同様に、特定のシナリオの長所と短所を比較する必要があります。シングルトンパターンにはその用途があります。

(多くの場合、アスペクト指向プログラミングと呼ばれますが、まったく同じことではないとの議論がありましたが、シングルトンの動作を得るためのオプションがあります。 ..これは私がこの時点で読む記事を見つけることができません)は間違いなく選択肢です。あなたは建設注入、decoratorパターン、抽象的な工場とinversion of control containerの任意の組み合わせを使用することができます。私はJavaのIoCコンテナではないですが、自動インターセプトを可能にするいくつかの.Netコンテナがあります(私はSpring.Netがそう考えているので、Spring(Java)にこれが組み込まれていると思います)。これは、複数のレイヤー(セキュリティ、ログなど)で特定のタイプのアクションを実行する必要がある、あらゆるタイプのクロスカッティングの問題に対して非常に便利です。また、ほとんどのIoCコンテナではライフタイム管理を制御できるため、実際にシングルトンパターンを手動で実装することなく、ロガーをシングルトンとして扱うことができます。

まとめてください。シングルトンがあなたのシナリオに合っている場合(あなたの説明からそうであるように思えます)、それに行きましょう。あなたが長所と短所を重視していることを確認してください。あなたは別のアプローチを試して、2つを比較したいかもしれません。

関連する問題