Один или несколько абстрактных фабрик для создания объектов в иерархии наследования?

113
12

У меня есть следующий сценарий здоровья клуба (закодированный в C++ BTW):

UML Diagram

Я хочу создать случайные объекты "Гость" и "Тренер" (так что у обоих будет случайное создание имен, но у гостя также будут данные случайного здоровья).

Я хочу иметь возможность создавать множество разных случайных генераторов различной сложности.

Столь очевидно, что для этого потребуется функция случайного имени генератора имени/фамилии, но я не уверен, как сохранить этот код в одном месте.

У меня могла бы быть абстрактная фабрика со всеми методами генерации (например, generateForename()), в которой могут использоваться все объекты, требующие случайной генерации. Но должен ли тренер иметь доступ к фабрике, которая может генерировать данные о состоянии здоровья, даже если она не имеет к ним никакого отношения?

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

Я новичок в этом, так что простите меня, если мой дизайн немного выключен.

Что вы предлагаете?

спросил(а) 2013-02-27T21:54:00+04:00 8 лет назад
1
Решение
61

Я не уверен, что абстрактная фабрика - это то, что вы ищете. Абстрактная фабрика работает лучше всего, когда у вас есть тот же базовый класс, но вам нужно создавать разные конкретные экземпляры. Хотя у вас есть основной базовый класс Person, вам действительно нужно создать производные двух разных базовых классов.

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

Не могли бы вы создать фабричный метод для Guest и Trainer, который затем сможет использовать методы в своих базовых классах для генерации данных? Может быть, создать подтемы, специфичные для тестирования, для того, чтобы сохранить материал теста от реальных вещей?

ответил(а) 2013-02-28T15:20:00+04:00 8 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема