Совместное использование объектов - PullRequest
1 голос
/ 21 августа 2009

Представьте, что у меня хороший класс колоды, в лучшем оо-стиле. У него есть карты, которые имеют костюм и ранг, метод Shuffle и т. Д. Теперь у меня будет много одновременных экземпляров колоды (скажем, это казино). Вопрос в следующем: должны ли быть разные экземпляры каждой карты во всех колодах?

Ответы [ 4 ]

6 голосов
/ 21 августа 2009

Объекты карты, вероятно, лучше всего реализовывать как неизменяемые объекты. Чтобы создать карту, вы должны передать костюм и ранг, и этот костюм и ранг никогда не будут изменены позднее.

С этой точки зрения, поскольку эти объекты не меняются и поскольку для начала существует заданный номер, имеет смысл реализовать одну статическую коллекцию, содержащую все 52 возможных объекта Card, и получить доступ к этим картам из других классы (сделайте конструктор класса Card закрытым, чтобы создать карту вне класса Card).

Подлинное различие заключается в том, что сами карты не выполняют никаких операций, другие операции будут действовать на карты, поэтому было бы неплохо создать один экземпляр карты.

4 голосов
/ 21 августа 2009

Официально он называется шаблоном Flyweight и был впервые представлен в GOF "Design Patterns". Должно быть очень полезно в вашем случае. Поскольку карты никогда не меняются, вы можете даже подумать о том, чтобы реализовать их как Enums.

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

0 голосов
/ 28 августа 2009

Вы спрашиваете: «Должны ли быть разные экземпляры каждой карты во всех колодах?» Ответ: нет : вы можете использовать один экземпляр каждой карты и делиться им со всеми колодами, даже если они работают в разных потоках. Причина заключается в том, что карты являются неизменяемыми, поэтому даже если два потока вызывают, скажем, card.getSuit () на одной карте, их вычисления не будут мешать.

Конечно, это верно только в том случае, если вы пишете карточный класс, чтобы он был действительно неизменным. Как только вы пишете в какую-то локальную переменную карты, вы подвергаетесь гонкам данных. Но я не могу придумать причину сделать это, поэтому вы должны быть в безопасности.

0 голосов
/ 21 августа 2009

Это зависит от того, как вы собираетесь использовать карты. Однако, вероятно, любое дополнительное использование памяти из дополнительных экземпляров Card будет тривиальным - в конце концов, каждая карта хранит только два байта данных.

...