J'ai donc une usine qui crée des objets de différentes classes. Les classes possibles sont toutes dérivées d'un ancêtre abstrait. La fabrique a un fichier de configuration (syntaxe JSON) et décide quelle classe créer, selon la configuration de l'utilisateur.
Pour ce faire, la fabrique utilise boost :: property_tree pour l'analyse JSON. Il parcourt le ptree et décide quel objet concret créer.
Cependant, les objets-produits ont de nombreux champs (attributs). Selon la classe concrète, l'objet a environ 5 à 10 attributs, à l'avenir peut-être encore plus.
Je ne sais donc pas à quoi devrait ressembler le constructeur des objets. Je peux penser à deux solutions:
1) Le constructeur du produit attend chaque attribut comme paramètre, ainsi, le constructeur se retrouvera avec 10+ paramètres. Ce sera laid et conduira à de longues lignes de code illisibles. Cependant, l'avantage est que la fabrique peut analyser le JSON et appeler le constructeur avec les paramètres corrects. La classe de produit n'a pas besoin de savoir qu'elle a été créée en raison de la configuration JSON. Il n'a pas besoin de savoir qu'il y a du JSON ou une configuration impliquée du tout.
2) Le constructeur du produit n'attend qu'un seul argument, l'objet property_tree. Ensuite, il peut analyser les informations nécessaires. Si des informations dans la configuration sont manquantes ou hors limites, chaque classe de produit peut réagir correctement. L'usine n'a pas besoin de connaître les arguments nécessaires aux différents produits. L'usine n'a pas non plus besoin de savoir comment réagir en cas de mauvaise configuration. Et l'interface constructeur est unifiée et petite. Mais, comme inconvénient, le produit doit extraire les informations nécessaires du JSON, ainsi, il sait comment il est construit.
J'ai tendance à préférer la solution 2). Cependant, je ne suis pas sûr que ce soit un bon modèle d'usine. Il semble en quelque sorte mal de laisser le produit savoir qu'il est créé avec la configuration JSON. D'un autre côté, de nouveaux produits peuvent être introduits très simplement.
Des opinions à ce sujet?