Шаблон для создания большой иерархии объектов

У меня есть проблема, которая включает иерархию относительно большого объекта следующим образом:

  • игра имеет одного общественного менеджера
  • у общественного менеджера есть одна сеть
  • сеть имеет многие плееры
  • сеть имеет много дружбы
  • у плеера есть один менеджер по стратегии
  • у плеера есть одна память
  • у плеера есть один район
  • район имеет многие плееры
  • у менеджера по стратегии есть много стратегий

Как Вы видите, иерархия относительно сложна, и по крайней мере в одном циклическом месте (сеть имеет много агентов, имеющих один район, который имеет одну сеть). В данный момент я использую статический метод конструкции на a GameFactory класс для построения целой иерархии, но я вполне уверен, это - наименее гибкий способ сделать его!

С точки зрения создания сложной иерархии объектов, что должен использовать лучший шаблон? Я читал на Factory Method, Abstract Factory и Builder шаблоны и я думаем, что один из шаблонов "фабрика" подходит, но я действительно не знаю, как применить его к такой сложной иерархии?

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


Править: Это стало ясным из обсуждения в предложениях, данных до сих пор, что я должен был объяснить больше о том, почему я требую, чтобы фабрики создали мои иерархии объектов вместо того, чтобы позволить самим конструкторам создавать свои зависимости.

Это вызвано тем, что я использую внедрение зависимости для помощи в разработке через тестирование. Я проявляю mockist подход к тестированию, которое требует способности ввести насмешки, представляющие зависимости объекта и как таковой, я должен избегать использования new в любых конструкторах.

От предложений, данных до сих пор, кажется, что существует много возможных способов сделать это:

  • Создайте вторичного конструктора в каждом классе, который создает любые зависимости, требуемые создаваемым объектом. Это позволяет внедрение зависимости и конструкцию иерархии простого объекта.
  • Имейте класс фабрики (или единственный или иерархия их в зависимости от типа используемого шаблона "фабрика") отображающийся на каждый доменный класс для контакта с его конструкцией.
  • Используйте комбинацию этих методов, где классы фабрики только создаются, когда существует что-то, что варьируется по процессу конструкции (т.е. различные подклассы должны быть созданы при определенных обстоятельствах),

Я склонен следовать последним маршрутом. Каково согласие по лучшему подходу для взятия в этой ситуации?


Править: Я отменяю текущий ответ (тот Patrick Karcher) с тех пор теперь, когда фокус этого вопроса был разъяснен, ни одно из предложений не полные ответы.

8
задан tobyclemson 28 January 2010 в 21:02
поделиться

3 ответа

Важно понимать Почему именно вам нужен фабрика. Как и с большим количеством «хорошей» практики, фабрика может дать определенные преимущества, которые вы иногда хотят, и которые вы получаете только, используя их правильно.

Часто фабрика является еще одним классом в вашей объектной модели. Например, вы часто заканчиваете плеером , потому что у вас есть соседство с коллекцией игроков , и вы помимо этого, делая вещи для игроки. Или вы начинаете с сетевой сети объекта. Или (я предполагаю, что у вас уже есть Player , вы получаете дружбу , и вы получаете Player . Итак Дружба IS Factory для Player Объектов и Игрок - завод Дружба Объекты!

Вы иногда делаете причину для не доменного, выделенного заводских объектов . У вас может быть заводский класс в качестве отправной точки для объектов, с которыми вы начнете свою логику. Часто они используются, когда существует много сложных способов, которыми некоторые из ваших объектов необходимо создать экземпляр, и фабрика - это хороший способ организовать их. Иногда ваши объекты должны быть созданы, например, например, слой данных и пользователь и контекст, а завод может поддерживать эти вещи, сделать ваши объекты и сохранить вас от необходимости повторять себя во многих разных конструкторах. Иногда завод может автоматически генерировать общие ссылки, которые необходимы ваши различные инструменты.

Существует одно использование фабрики, которая быстро растет в популярности, и заслуживает особого упоминания. Это использование заводского класса для добавления слоя неправильного направления в вложенных зависимостей , особенно для тестирования устройства .

Мой совет - это если у вас нет конкретной причины для использования фабричного объекта, не беспокойтесь о них. Просто постройте свои объекты хорошими конструкциями. Тогда будет естественно добавлять свойства, которые возвращают связанные объекты; Это будут ваши первые фабрики. Это может быть хорошим примером того, как вы не хотите беспокоиться о рисунках проектирования; Шаблоны дизайна не допускают успеха. Вы делаете. Узоры, такие как различные заводские шаблоны, могут помочь, но не должны заменять базовое объектно-ориентированное мышление.

У вас есть определенные причины, поскольку вам нужны выделенные фабричные объекты?

-121--3690517-

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

2
ответ дан 5 December 2019 в 20:16
поделиться

Если ничего не меняется , т.е. если ваш процесс строительства фиксирован, я бы порекомендовал самый простой способ: пусть сами объекты позаботятся о построении зависимых от них объектов, а также об установлении связей (потенциально двунаправленных).

Пример : Для родительского объекта с коллекцией дочерних объектов родитель может использовать метод addChild, который обеспечивает согласованность двунаправленной связи :

  1. получить предыдущего родителя дочернего объекта; если не нулевой, то удалить дочерний объект от этого старого родителя.
  2. изменить родительское поле в дочернем процессе на новое родительское
  3. добавить дочерний элемент к сбору дочерних элементов от нового родителя.

Если что-то изменяется , например, подклассы, которые должны использоваться в определенном контексте, то вы должны точно определить, что именно изменяется. Только после того, как вы нашли вашу точную потребность, могут появиться правильные шаблоны. :-)

Мы могли бы помочь с последней частью, но только вы можете дать нужную информацию... ;-)

.
2
ответ дан 5 December 2019 в 20:16
поделиться

Там нет необходимости назвать это. .NET имеет класс Uribuilder , который может помочь вам в создании вашего URL-адреса. Проверьте эту статью, чтобы увидеть, как это работает и сделать его немного более интуитивно понятным:

http://codeiDol.com/csharp/csharpckbk2/web/using-the-uribuilder-Class/

-121 1728974-

Важно понимать Почему именно вам нужен фабрика. Как и с большим количеством «хорошей» практики, фабрика может дать определенные преимущества, которые вы иногда хотят, и которые вы получаете только, используя их правильно.

Часто фабрика является еще одним классом в вашей объектной модели. Например, вы часто заканчиваете проигрывателю , потому что у вас есть соседство с коллекцией игроков , и вы помимо этого, делая вещи для игроки. Или вы начинаете с сетевой сети объекта. Или (я предполагаю, что у вас уже есть проигрыватель , вы получаете дружбу , и вы получите от него . Итак, дружба IS Factory для Player объектов и Player - это фабрика Дружба объектов!

Вы делаете, хотя иногда есть основания для не доменного, выделенных фабричных объектов . У вас может быть заводский класс в качестве отправной точки для объектов, с которыми вы начнете свою логику. Часто они используются, когда существует много сложных способов, которыми некоторые из ваших объектов необходимо создать экземпляр, и фабрика - это хороший способ организовать их. Иногда ваши объекты должны быть созданы, например, например, слой данных и пользователь и контекст, а завод может поддерживать эти вещи, сделать ваши объекты и сохранить вас от необходимости повторять себя во многих разных конструкторах. Иногда завод может автоматически генерировать общие ссылки, которые необходимы ваши различные инструменты.

Существует одно использование фабрики, которая быстро растет популярностью, и заслуживает особого упоминания. Это использование заводского класса для добавления слоя неправильного направления до вложенных зависимостей , особенно для тестирования устройства .

Мой совет - это если у вас нет конкретной причины использовать фабричный объект, не беспокойтесь о них. Просто постройте свои объекты хорошими конструкциями. Тогда будет естественно добавлять свойства, которые возвращают связанные объекты; Это будут ваши первые фабрики. Это может быть хорошим примером того, как вы не хотите беспокоиться о рисунках проектирования; Шаблоны дизайна не допускают успеха. Вы делаете. Узоры, такие как различные заводские шаблоны, могут помочь, но не должны заменять базовое объектно-ориентированное мышление.

У вас есть определенные причины, поскольку вам нужны выделенные фабричные объекты?

4
ответ дан 5 December 2019 в 20:16
поделиться