最高のOOファッションで素晴らしいデッキクラスを持っていると想像してみてください。スーツとランクのあるカード、シャッフル方式などがあります。今、私はデッキの多くの同時インスタンスを持つつもりです(これはカジノだと言ってください)。問題は、すべてのデッキにわたってすべてのカードの異なるインスタンスがあるべきかということです。
4 に答える
カードオブジェクトは、おそらく不変オブジェクトとして実装するのが最適です。カードを作成するには、スーツとランクを渡す必要があります。このスーツとランクが後で変更されることはありません。
その観点から、これらのオブジェクトは変更されず、最初に設定された番号があるため、52個の可能なCardオブジェクトすべてを含む単一の静的コレクションを実装し、他のクラスからこれらのカードにアクセスすることは理にかなっています(make Cardプライベートのコンストラクターであるため、Cardクラスの外部でカードを作成することはできません)。
ここでの本当の違いは、カード自体は操作を実行せず、他の操作はカードに作用するため、カードの単一インスタンスを作成することは問題ないはずです。
これは正式にはフライウェイトパターンと呼ばれ、GOFの「デザインパターン」で最初に登場しました。あなたの場合に非常に役立つはずです。カードは変更されないため、列挙型として実装することも考えられます。
カードの使い方によって異なります。ただし、おそらく、Cardの追加のインスタンスからの追加のメモリ使用量はわずかです。結局のところ、各カードは2バイトのデータしか保存していません。
あなたは尋ねます:「すべてのデッキにわたってすべてのカードの異なるインスタンスがあるべきですか?」答えはノーです。各カードの単一のインスタンスを使用して、異なるスレッドで実行されている場合でも、すべてのデッキで共有できます。その理由は、カードは不変であるため、2つのスレッドが同じカードでたとえばcard.getSuit()を呼び出したとしても、それらの計算は干渉しません。
もちろん、これは、カードクラスを実際に不変になるように記述した場合にのみ当てはまります。カードのローカル変数に書き込むとすぐに、データの競合にさらされます。しかし、私はそれをする理由を考えることができないので、あなたは安全でなければなりません。