私は素晴らしいOOの方法で素敵なデッキクラスを持っていると想像してください。カードにはSuitとRankがあり、Shuffleメソッドなどがあります。さて、私はデッキの同時インスタンスをたくさん持つつもりです(これはカジノです)。問題は、すべてのデッキにあるすべてのカードのインスタンスが異なるかどうかです。オブジェクトを共有する
答えて
カードオブジェクトはおそらく、不変オブジェクトとして最もよく実装されます。カードを作成するには、スーツとランクを渡す必要があります。このスーツとランクは、後で変更されることはありません。
これらのオブジェクトは変更されないため、先頭にセット番号があるため、52個のすべてのCardオブジェクトを含む1つの静的コレクションを実装し、これらのカードにアクセスしてください他のクラス(Cardのコンストラクタをprivateにして、Cardクラスの外にカードを作成することは不可能です)。
ここで実際の違いは、カード自体が操作を実行しないことです。他の操作がカードに作用するため、カードの単一のインスタンスを作成するだけで十分です。
カードをどのように使用するかによって異なります。おそらく、カードの余分なインスタンスから余分なメモリ使用量は些細なものになります - 結局、各カードは2バイトのデータしか格納していません。
正式にはフライウェイトパターンと呼ばれ、GOFの「デザインパターン」で最初にプレゼンテーションされました。あなたのケースでは非常に便利なはずです。カードは決して変わらないので、それらをEnumとして実装することさえ考えられるかもしれません。
あなたは尋ねる:「すべてのデッキ全体ですべてのカードの別のインスタンスがありますか?」答えはです。です。各カードのインスタンスを1つ使用して、異なるスレッドで実行している場合でもすべてのデッキで共有できます。その理由は、カードは不変であるため、同じカード上で2つのスレッドが例えばcard.getSuit()を呼び出しても、それらの計算は干渉しません。
これは本当に不変であるようにカードクラスを書く場合にのみ当てはまります。あなたがカードのいくつかのローカル変数に書き込むとすぐに、自分自身をデータ競争にさらします。しかし、私はそれをする理由を考えることができないので、あなたは安全でなければなりません。
- 1. Java共有オブジェクト
- 2. C++:オブジェクトへの共有ポインタではなく、共有オブジェクトを作成する
- 3. Web APIオブジェクト共有
- 4. 共有オブジェクトのPyDoc
- 5. NSArrayインスタンスをKVOオブジェクトに共有する
- 6. Javaプロセス間でオブジェクトを共有する
- 7. スレッド間でXPObjectオブジェクトを共有する
- 8. オブジェクト間でデータを共有するシングルトンパターン
- 9. ワーカープロセス間でオブジェクトを共有
- 10. オブジェクトを共有するための共有メモリ(ポインタであるメンバーを含む)
- 11. 共有オブジェクト(DLL)に関する質問
- 12. 別のソリューション間で共通のオブジェクトを共有する方法
- 13. 共有オブジェクトの構文
- 14. プロセス間のNodeJs共有オブジェクト
- 15. HashMap共有オブジェクトの問題
- 16. 共有オブジェクト名の衝突
- 17. オブジェクト共有の間のブーリアンブール
- 18. Redhat Linuxの共有オブジェクト
- 19. dlopenと共有オブジェクトのポインタ
- 20. PythonのアクセスC共有オブジェクト
- 21. Pythonオブジェクトのプロパティの共有
- 22. 共有socket.ioは空のオブジェクト
- 23. 共有オブジェクトについて
- 24. mavenアセンブリに共有オブジェクトを含める
- 25. C#でIDisposableオブジェクトの共有所有者
- 26. ローカル共有オブジェクト(.soファイル)としてAndroidのexeリンキングシステム共有オブジェクト(.soファイル)
- 27. オブジェクトのJavascript配列、同じメンバ配列を共有するオブジェクト?
- 28. WCFサービス間でDTOオブジェクトを共有
- 29. netcdfスタティックライブラリを含むFortranコンパイル共有オブジェクト
- 30. キュウリのシナリオ間でオブジェクトを共有