Entonces tengo una fábrica que crea objetos de diferentes clases. Las posibles clases se derivan de un antepasado abstracto. La fábrica tiene un archivo de configuración (sintaxis JSON) y decide qué clase crear, según la configuración del usuario.
Para lograr esto, la fábrica utiliza boost :: property_tree para el análisis JSON. Camina por la calle y decide qué objeto concreto crear.
Sin embargo, los objetos del producto tienen muchos campos (atributos). Dependiendo de la clase concreta, el objeto tiene unos 5-10 atributos, en el futuro tal vez incluso más.
Así que no estoy seguro de cómo debería ser el constructor de los objetos. Se me ocurren dos soluciones:
1) El constructor del producto espera cada atributo como parámetro, por lo tanto, el constructor terminará con más de 10 parámetros. Esto será feo y dará lugar a líneas de código largas e ilegibles. Sin embargo, la ventaja es que la fábrica puede analizar el JSON e invocar al constructor con los parámetros correctos. La clase de producto no necesita saber que se ha creado debido a la configuración de JSON. No necesita saber que hay JSON o configuración involucrada en absoluto.
2) El constructor del producto solo espera un argumento, el objeto property_tree. Entonces puede analizar la información necesaria. Si falta información de la configuración o está fuera de los límites, cada clase de producto puede reaccionar correctamente. La fábrica no necesita saber qué argumentos necesitan los diversos productos. La fábrica tampoco necesita saber cómo reaccionar en caso de una configuración incorrecta. Y la interfaz del constructor es unificada y pequeña. Pero, como desventaja, el producto necesita extraer la información necesaria del JSON, por lo tanto, sabe cómo se construye.
Tiendo a preferir la solución 2). Sin embargo, no estoy seguro de si este es un buen patrón de fábrica. De alguna manera se siente mal dejar que el producto sepa que está creado con la configuración JSON. Por otro lado, se pueden introducir nuevos productos de forma muy sencilla.
¿Alguna opinión sobre eso?