Quindi ho una fabbrica che crea oggetti di classi diverse. Le possibili classi sono tutte derivate da un antenato astratto. La factory ha un file di configurazione (sintassi JSON) e decide quale classe creare, a seconda della configurazione dell'utente.
Per raggiungere questo obiettivo, factory utilizza boost :: property_tree per l'analisi di 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 essere il costruttore degli oggetti. Posso pensare a 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 code di codice illeggibili. Tuttavia, il vantaggio è che la fabbrica può analizzare il JSON e invocare il costruttore con i parametri corretti. La classe del prodotto non ha bisogno di sapere che è stata creata a causa della configurazione JSON. Non ha bisogno di sapere che JSON o la configurazione sono coinvolti.
2) Il costruttore del prodotto si aspetta solo un argomento, l'oggetto property_tree. Quindi può analizzare le informazioni necessarie. Se le informazioni nella configurazione sono mancanti o fuori campo, ciascuna classe di prodotto può reagire correttamente. La fabbrica non ha bisogno di sapere quali argomenti sono necessari per i diversi prodotti. La fabbrica inoltre non ha bisogno di sapere come reagire in caso di configurazione errata. E l'interfaccia del costruttore è unificata e piccola. Ma, come svantaggio, il prodotto ha bisogno di estrarre le informazioni necessarie dal JSON, quindi, sa come è costruito.
Tendo a preferire la soluzione 2). Tuttavia, non sono sicuro se questo è un buon modello di fabbrica. Sembra in qualche modo sbagliato far sapere al prodotto che è stato creato con la configurazione JSON. Dall'altra parte, i nuovi prodotti possono essere introdotti in modo molto semplice.
Qualche opinione su questo?