The factory pattern puede ayudar a aliviar el dolor de la adición una dependencia, porque una fábrica puede contener el estado y, de hecho, puede encapsular varias dependencias (por ejemplo, en lugar de proporcionar tres dependencias, todas necesarias para invocar el constructor de algún objeto, ahora solo proporciona un único objeto de fábrica; tres objetos que se deben proporcionar al constructor).
Para dar un ejemplo, comparar:
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();
}
Y:
void DoIt(const DependencyCFactory& factory) {
int x = ComputeX();
std::unique_ptr<DependencyC> dependency_c(factory->Create(x));
dependency_c->DoStuff();
}
Tenga en cuenta que la segunda versión requiere un menor número de dependencias con el método "DoIt". Esto no quiere decir que esas dependencias no se necesitan en todo el programa (de hecho, el programa todavía hace uso de DependencyA y DependencyB en el implementaiton de la fábrica). Sin embargo, mediante la estructuración de esta manera, que la dependencia se puede aislar a sólo el código de fábrica, lo que mantiene otro código más simple, hace que sea más fácil cambiar las dependencias de DependencyC
(ahora sólo la fábrica, en sí, necesita ser actualizado, no todos los lugares que ejemplifica DependencyC
), e incluso puede tener ciertas ventajas de seguridad (por ejemplo, si DependencyA
y DependencyB
son sensibles, como contraseñas de bases de datos o claves API, limitar su uso a la fábrica reduce las posibilidades de mal manejo, en comparación con los casos donde donde sea que necesites usar el databse o la API, por ejemplo).
En el ejemplo dado en el libro, la razón por la que habría ayudado una fábrica para el Order
es que habría reducido el número de lugares donde el constructor se usa directamente; solo el único lugar que creó la fábrica necesitaría modificarse para almacenar el Customer
como un campo adicional de la fábrica; ninguno de los otros usos de la fábrica necesitaría ser modificado. En comparación, sin el uso de la fábrica, abundan los usos directos del constructor, y cada uno de ellos debe actualizarse para obtener de algún modo acceso al objeto Customer
.
Hay millones (si no miles de millones) de libros disponibles. No todos son correctos. No dé nada por sentado solo porque alguien lo escribió en un libro. – kazanaki