2009-08-20 15 views
1

私は素晴らしいOOの方法で素敵なデッキクラスを持っていると想像してください。カードにはSuitとRankがあり、Shuffleメソッドなどがあります。さて、私はデッキの同時インスタンスをたくさん持つつもりです(これはカジノです)。問題は、すべてのデッキにあるすべてのカードのインスタンスが異なるかどうかです。オブジェクトを共有する

答えて

6

カードオブジェクトはおそらく、不変オブジェクトとして最もよく実装されます。カードを作成するには、スーツとランクを渡す必要があります。このスーツとランクは、後で変更されることはありません。

これらのオブジェクトは変更されないため、先頭にセット番号があるため、52個のすべてのCardオブジェクトを含む1つの静的コレクションを実装し、これらのカードにアクセスしてください他のクラス(Cardのコンストラクタをprivateにして、Cardクラスの外にカードを作成することは不可能です)。

ここで実際の違いは、カード自体が操作を実行しないことです。他の操作がカードに作用するため、カードの単一のインスタンスを作成するだけで十分です。

0

カードをどのように使用するかによって異なります。おそらく、カードの余分なインスタンスから余分なメモリ使用量は些細なものになります - 結局、各カードは2バイトのデータしか格納していません。

4

正式にはフライウェイトパターンと呼ばれ、GOFの「デザインパターン」で最初にプレゼンテーションされました。あなたのケースでは非常に便利なはずです。カードは決して変わらないので、それらをEnumとして実装することさえ考えられるかもしれません。

http://en.wikipedia.org/wiki/Flyweight_pattern

0

あなたは尋ねる:「すべてのデッキ全体ですべてのカードの別のインスタンスがありますか?」答えはです。です。各カードのインスタンスを1つ使用して、異なるスレッドで実行している場合でもすべてのデッキで共有できます。その理由は、カードは不変であるため、同じカード上で2つのスレッドが例えばcard.getSuit()を呼び出しても、それらの計算は干渉しません。

これは本当に不変であるようにカードクラスを書く場合にのみ当てはまります。あなたがカードのいくつかのローカル変数に書き込むとすぐに、自分自身をデータ競争にさらします。しかし、私はそれをする理由を考えることができないので、あなたは安全でなければなりません。

関連する問題