У меня проблема с относительно большой иерархией объектов:
- игра имеет один менеджер сообщества
- менеджер сообщества имеет одну сеть
- сеть имеет много игроков
- сеть имеет много друзей
- игрок имеет одного менеджера стратегии
- игрок имеет одну память
- игрок имеет один район
- окрестности имеет много игроков
- менеджер стратегий имеет множество стратегий
Как видите, иерархия является относительно сложной и, по крайней мере, в одном месте циклической (сеть имеет много агентов, имеющих одну окрестность, которая имеет одну сеть). В настоящее время я использую метод статического конструирования в классе GameFactory
для построения всей иерархии, но я уверен, что это наименее гибкий способ сделать это!
С точки зрения построения сложной иерархии объектов, какой шаблон лучше всего использовать? Я прочитал шаблоны Factory Method
, Abstract Factory
и Builder
и думаю, что один из заводских шаблонов подходит, но я не знаю, как применить его к такой сложной иерархии?
На мой взгляд, мне понадобится много фабрик для каждой части системы, но это приведет к коллекции фабричных классов, отражающих классы моделей.
Редактировать: Из приведенных выше предложений стало ясно, что я должен был объяснить больше о том, почему я требую, чтобы фабрики строили свои иерархии объектов, а не позволяли самим конструкторам строить свои зависимости.
Это потому, что я использую внедрение зависимостей, чтобы помочь в разработке через тестирование. Я использую подход к тестированию, основанный на принципах «mockist», который требует способности вставлять макеты, представляющие зависимости объекта, и поэтому я должен избегать использования new
в любых конструкторах.
Судя по приведенным выше предложениям, существует несколько возможных способов сделать это:
- Создайте вторичный конструктор в каждом классе, который строит любые зависимости, требуемые для создаваемого объекта. Это позволяет внедрять зависимости и строить простую иерархию объектов.
- Имейте фабричный класс (или один или их иерархию в зависимости от типа используемого фабричного образца), сопоставляющийся с каждым классом домена, чтобы иметь дело с его конструкцией.
- Используйте комбинацию этих методов, когда фабричные классы создаются только тогда, когда есть что-то, что изменяется в процессе конструирования (т. Е. При определенных обстоятельствах необходимо создавать разные подклассы)
Я склонен идти по последнему маршруту. Каков консенсус относительно наилучшего подхода в этой ситуации?
Редактировать: Я отменяю текущий ответ (ответ Патрика Карчера), так как теперь, когда фокус этого вопроса прояснен, ни одно из предложений не является полным ответом.