Так что у меня есть фабрика, которая создает объекты разных классов. Все возможные классы происходят от абстрактного предка. Фабрика имеет файл конфигурации (синтаксис JSON) и решает, какой класс создать, в зависимости от конфигурации пользователя.
Чтобы добиться этого, фабрика использует boost :: property_tree для JSON-анализа. Он идет по дереву и решает, какой конкретный объект создать.
Однако у объектов-продуктов есть много полей (атрибутов). В зависимости от конкретного класса, объект имеет около 5-10 атрибутов, в будущем может быть даже больше.
Поэтому я не уверен, как должен выглядеть конструктор объектов. Я могу придумать два решения:
1) Конструктор продукта ожидает каждый атрибут в качестве параметра, поэтому у конструктора будет более 10 параметров. Это будет ужасно и приведет к длинным нечитаемым строкам кода. Однако преимущество заключается в том, что фабрика может анализировать JSON и вызывать конструктор с правильными параметрами. Класс продукта не должен знать, что он был создан из-за конфигурации JSON. Нет необходимости знать, что JSON или конфигурация задействованы вообще.
2) Конструктор продукта ожидает только один аргумент, объект property_tree. Затем он может разобрать необходимую информацию. Если информация в конфигурации отсутствует или выходит за границы, каждый класс продукта может реагировать должным образом. Фабрике не нужно знать, какие аргументы нужны нескольким продуктам. Завод также не должен знать, как реагировать в случае неправильной конфигурации. И интерфейс конструктора унифицирован и мал. Но, как недостаток, продукт должен извлекать необходимую информацию из JSON, поэтому он знает, как он построен.
Я склонен предпочесть решение 2). Однако я не уверен, что это хорошая фабричная модель. Как-то неправильно, сообщая продукту, что он создан с конфигурацией JSON. С другой стороны, новые продукты могут быть введены очень просто.
Есть мнения по этому поводу?