Тож у мене є завод, який створює об’єкти різних класів. Усі можливі класи походять від абстрактного предка. Фабрика має файл конфігурації (синтаксис JSON) і вирішує, який клас створити, залежно від конфігурації користувача.
Щоб досягти цього, фабрика використовує boost :: property_tree для JSON-розбору. Він проходить птахом і вирішує, який конкретний об’єкт створити.
Однак у продуктів-об’єктів є багато полів (атрибутів). Залежно від класу конкретності, об’єкт має близько 5-10 атрибутів, в майбутньому може бути навіть більше.
Тож я не впевнений, як повинен виглядати конструктор об’єктів. Я можу придумати два рішення:
1) Конструктор продукту очікує, що кожен атрибут є параметром, таким чином, конструктор закінчить 10+ параметрів. Це буде некрасиво і призведе до довгих нечитабельних рядків коду. Однак перевага полягає в тому, що фабрика може проаналізувати JSON і викликати конструктор з правильними параметрами. Класу продукту не потрібно знати, що він створений завдяки конфігурації JSON. Не потрібно знати, що взагалі є JSON або конфігурація.
2) Конструктор продукту очікує лише одного аргументу, об'єкта property_tree. Тоді він може розібрати необхідну інформацію. Якщо інформація в конфігурації відсутня або знаходиться поза межами, кожен клас продукту може правильно реагувати. Фабриці не потрібно знати, які аргументи потрібні декільком продуктам. Фабриці також не потрібно знати, як реагувати у разі неправильної конфігурації. І інтерфейс конструктора уніфікований і малий. Але, як недолік, продукт повинен отримати необхідну інформацію з JSON, таким чином, він знає, як він побудований.
Я, як правило, віддаю перевагу рішенню 2). Однак я не впевнений, чи це хороший заводський зразок. Начебто неправильно повідомляти про продукт, що він створений з конфігурацією JSON. З іншого боку, нові продукти можна представити дуже просто.
Будь-які думки з цього приводу?