2012-04-12 18 views
1

私はここでライター、ストレージ、リーダーと呼ぶことができる3つのクラスが必要な他の多くのものの中でプログラムを書いています。シングルトンパターンを避ける必要がありますか?

ライターはストレージクラスに非常に頻繁にアクセスする必要がありますが、リーダーはライターと比較してあまり頻繁ではありません。ストレージクラスは、データライターの書き込みを格納するためにのみ存在します。作家がやっている唯一の事は、データの短いバーストをかなり頻繁に書くことです。読み取り装置は、記憶装置から書き込まれたデータを読み取り、記憶装置をフラッシュして、書き込み装置が新しいデータを書き込むためのスペースを解放する。いくつかの数字とアクセスの頻度のアイデアを与えるために、作家が数分でストレージにアクセスしており、読者が約1時間に1回それにアクセスしているとしましょう。

それでは、ストレージクラスでシングルトンパターンを使用する必要がありますか、静的クラスとして宣言するだけで十分ですか?

また、リーダークラスがストレージを使用しているときに、ストレージリソースを読み込み、フラッシュした直後にストレージリソースを解放する方法を確認できますか?ほとんどの場合、ストレージクラスは、ライターがデータを書き込むために使用できる必要があります。

シングルトンのアプローチは、特に私がOOPのバックグラウンドではないことが素敵です。私はそれが悪いと聞いたことがある。

+1

私にとっては、並行性と同期の問題のように聞こえます。それに加えて、オブジェクトを作成するためのコンストラクタの適切な使用が最善の選択です。 – nobeh

+0

いいえ、それは宿題ではありません。私はライターと読者が同時にストレージにアクセスしていないことを確認する必要がある稀な瞬間もありますが、これは同時に並行性と同期の問題であることに同意します。したがって、私はまた、リーダーができるだけ早く実行することを確認したいと思います。読者は実際に書いているフラッシュ操作を行う必要があることに注意してください(書込みなしでフラッシュする方法がない限り)。 – zaplec

+0

[java.util.concurrent.locks](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/package-summary)のさまざまなオプションを調べることをお勧めします。 html) – nobeh

答えて

0

基本的にシングルトンは静的クラスとほぼ同じです。同じ状況では両方とも悪くて良いですが、シングルトンはもっと「オブジェクト指向」です。プロトタイプベースの言語では、実際の区別はありません。

シングルトンは、多くの人がグローバル変数(これは誰もが「悪い」と知っている)の代わりにそれらを使用しているため、悪い担当者を取得します。このようにして、シングルトンはグローバル変数として同じように悪いです。インスタンスが1つしかないことが確かに確かであるオブジェクトを実際にモデル化する場合は、シングルトンを使用します。理論的にもが将来別のインスタンスを持つ場合や、特定のものをモデル化しない場合は、シングルトンパターンを使用しないでください。

これはあなたのリーダー/ライターの問題とは関係ありません。 1つは、コメントとして示されるように、プロデューサ/コンシューマパターン、またはオブザーバパターン(実装方法に応じて)です。もう1つは基本的なオブジェクト指向設計の問題です。

+0

ストレージクラスは、巨大なグローバル変数として使用されます。読者クラスはかなりのメモリを必要とし、1時間に1回しか使用されないため、直接書き込むことは選択肢ではありません。次に、ライタークラスが破壊されたり停止されたりすることもありますが、読者が必要なときにデータを利用できるようにする必要があります。そのため、データがプログラムに書かれている限り、ランニング。 – zaplec

0

私はストレージクラスでシングルトンパターンを使用する必要がありますか、それとも静的クラスとして宣言するには ですか?

これらは無関係の質問です。
シングルトンは、あなたが持つはずのクラスのインスタンス数です。
シングルトンを使用すると、プログラム内でインスタンスを1つだけ強制します。
これが必要な場合は、シングルトンを使用してください。
残りの部分はプロデューサ/コンシューマパターンについて読むべきです

2

いつものように、これらの種類の質問では、1つの正解があるとは思いません。

まず、すでにa very good answer to that questionがあります。

シングルトンパターンの典型的な実装は、そのクラスの唯一のインスタンスを含む静的フィールドに依存しています。静的フィールドは本質的にすべての欠点(例:グローバル変数)を持つため、このアプローチはまったく嫌いです。隠された依存性とカップリングの増加のリスク、テスト容易性に有害な)。

しかし、アプリケーションでクラスのインスタンスを1つだけ必要とするという意味で、より一般的な考え方は、おそらくあなたが記述したシナリオでは良い考えです。しかし、静的変数を介して魔法のようにアクセスするのではなく、それを使用しているクラスのコンストラクタに渡します。 このように、クラス間の依存関係は明白であり、テストを簡略化します(例えば、実際のクラスではなくモックを注入する場合など)。 constructor injectionの詳細については、こちらをご覧ください。

関連する問題