The factory pattern può alleviare il dolore di aggiunta una dipendenza, perché una fabbrica può contenere stato e, infatti, può incapsulare più dipendenze (ad esempio, invece di fornire tre dipendenze, tutti bisogno di invocare il costruttore di qualche oggetto, è ora forniscono solo un oggetto di fabbrica di singolo, dove la fabbrica contiene quelli tre oggetti che devono essere forniti al costruttore).
per fare un esempio, confrontare:
void DoIt(const DependencyA& a, const DependencyB& b) {
// NOTE: "x" is a contrived additional variable that we add here to
// justify why we didn't just pass DependencyC directly.
int x = ComputeX();
std::unique_ptr<DependencyC> dependency_c(new DependencyC(a, b, x));
dependency_c->DoStuff();
}
E:
void DoIt(const DependencyCFactory& factory) {
int x = ComputeX();
std::unique_ptr<DependencyC> dependency_c(factory->Create(x));
dependency_c->DoStuff();
}
Nota che la seconda versione richiesto un minor numero di dipendenze al metodo "DoIt". Ciò non significa che tali dipendenze non siano necessarie nell'intero programma (infatti, il programma utilizza ancora DependencyA e DependencyB nell'implementazione della fabbrica). Tuttavia, strutturandolo in questo modo, tale dipendenza può essere isolata solo dal codice di fabbrica, che semplifica l'altro codice, facilita la modifica delle dipendenze di DependencyC
(ora solo la fabbrica, di per sé, deve essere aggiornata, non ogni luogo che crea un'istanza di DependencyC
) e può anche avere alcuni vantaggi in termini di sicurezza (ad esempio se DependencyA
e DependencyB
sono sensibili come le password del database o le chiavi API, limitando il loro utilizzo in fabbrica riduce le possibilità di maltrattamento, rispetto ai casi in cui si passa in giro ovunque tu abbia bisogno di usare il databse o l'API, per esempio).
Nell'esempio riportato nel libro, il motivo per cui avere una fabbrica per il Order
avrebbe aiutato è che avrebbe ridotto il numero di posti in cui il costruttore viene utilizzato direttamente; solo l'unico posto che ha creato la fabbrica avrebbe dovuto essere modificato per memorizzare Customer
come un campo aggiuntivo della fabbrica; nessuno degli altri usi della fabbrica avrebbe bisogno di essere modificato. In confronto, senza l'uso della fabbrica, gli usi diretti del costruttore abbondano e ciascuno di essi deve essere aggiornato per ottenere in qualche modo l'accesso all'oggetto Customer
.
Ci sono milioni (se non miliardi di libri) là fuori. Non tutti sono corretti. Non dare nulla per scontato solo perché qualcuno lo ha scritto in un libro. – kazanaki