Quindi, il mio codice aziendale ha bisogno di alcuni oggetti.
Non sa quanti oggetti ha bisogno e non conosce i tipi esatti (perché il polimorfismo è coinvolto).
Per me, questo suona per una buona ragione per andare in fabbrica.
Il mio codice ora appare come:
std::vector<AbstractBaseClass*> objectList;
Factory f;
objectList = f.create("path/to/config.txt");
Il prototipo del metodo di creazione della factory ha il seguente aspetto:
std::vector<AbstractBaseClass*> Factory ::create(std::string configFile)
Buone notizie, funziona!
La Factory legge la configurazione, quindi decide quanti oggetti creare e quali tipi di calcestruzzo hanno.
Bene, ho fatto molte ricerche ma non ho trovato un esempio di fabbrica che restituisce non un singolo oggetto ma un contenitore. Quindi, la mia domanda: è questo buono stile?
Penso di sì perché in questo modo l'intero processo di parsing / creazione è nascosto dalla logica del business. La logica sa solo che ha un contenitore con un mucchio di oggetti. Ma forse hai altre opinioni?
Nota: questo progetto è incentrato sull'apprendimento delle buone abitudini OOP.
Ok, immagina che questo approccio sia OK.
Ho imparato, i puntatori grezzi sono malvagi. (OK, non sono cattivi per definizione, ma cerco di evitarli).
Quindi, voglio passare ad alcuni indicatori intelligenti. Manca boost
e C++11
su questa macchina Sto iniziando con auto_ptr
.
OK, nuovo approccio:
std::vector< auto_ptr<AbstractBaseClass> > objectList;
Factory f;
objectList = f.create("path/to/config.txt");
E fabbrica:
std::vector< auto_ptr <AbstractBaseClass> > Factory ::create(std::string configFile)
Questo sembra malvagio.
E non viene compilato perché al momento sto ricevendo alcuni errori del compilatore STL pazzi.
Ma immagina che compili.
È buono questo?
Non ho mai visto un simile costrutto - una fabbrica che restituisce un contenitore di puntatori intelligenti. E poiché non sono un esperto, voglio chiederti cosa ne pensi.
Su una nota correlata, quale puntatore intelligente dovrei usare?
La logica aziendale è l'unico proprietario degli oggetti, quindi suppongo unique_ptr.
Tuttavia, non sono sicuro che sia possibile restituire un contenitore unique_ptr.
shared_ptr è più facile da implementare, credo.