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