Quindi ho una fabbrica che crea oggetti di diverse classi. Le possibili classi sono tutte derivate da un antenato astratto. Il factory ha un file di configurazione (sintassi JSON) e decide quale classe creare, a seconda della configurazione dell'utente.
Per raggiungere questo obiettivo, la fabbrica utilizza boost :: property_tree per l'analisi JSON. Cammina attraverso il ptree e decide quale oggetto concreto creare.
Tuttavia, gli oggetti prodotto hanno molti campi (attributi). A seconda della classe concreta, l'oggetto ha circa 5-10 attributi, in futuro forse anche di più.
Quindi non sono sicuro di come dovrebbe apparire il costruttore degli oggetti. Mi vengono in mente due soluzioni:
1) Il costruttore del prodotto si aspetta che ogni attributo sia un parametro, quindi il costruttore finirà con 10+ parametri. Questo sarà brutto e porterà a lunghe righe di codice illeggibili. Tuttavia, il vantaggio è che la factory può analizzare JSON e invocare il costruttore con i parametri corretti. La classe di prodotto non deve sapere che è stata creata a causa della configurazione JSON. Non ha bisogno di sapere che è coinvolto JSON o la configurazione.
2) Il costruttore del prodotto prevede solo un argomento, l'oggetto property_tree. Quindi può analizzare le informazioni necessarie. Se le informazioni sulla configurazione sono mancanti o fuori limite, ogni classe di prodotto può reagire correttamente. La fabbrica non ha bisogno di sapere quali argomenti sono necessari ai vari prodotti. Inoltre, la fabbrica non deve sapere come reagire in caso di configurazione errata. E l'interfaccia del costruttore è unificata e piccola. Ma, come svantaggio, il prodotto deve estrarre le informazioni necessarie da JSON, quindi sa come è costruito.
Tendo a preferire la soluzione 2). Tuttavia, non sono sicuro che questo sia un buon modello di fabbrica. Sembra in qualche modo sbagliato far sapere al prodotto che è stato creato con la configurazione JSON. Dall'altro lato, i nuovi prodotti possono essere introdotti in modo molto semplice.
Qualche opinione su questo?