Mi comprensión de una fábrica es que encapsula la creación de instancias de clases concretas que todas heredan una clase o interfaz abstracta común. Esto permite que el cliente se desacople del proceso de determinar qué clase concreta crear, lo que a su vez significa que puede agregar o eliminar clases concretas de su programa sin tener que cambiar el código del cliente. Puede que tenga que cambiar la fábrica, pero la fábrica está "construida a propósito" y realmente solo tiene una razón para cambiar: se ha agregado/eliminado una clase concreta.¿Es confuso llamar a esta clase una "fábrica"?
He creado algunas clases que, de hecho, encapsulan la instanciación de objetos, pero por una razón diferente: los objetos son difíciles de crear. Por el momento, llamo a estas clases "fábricas", pero me preocupa que pueda ser un término inapropiado y que podría confundir a otros programadores que podrían ver mi código. Mis clases de "fábrica" no deciden qué clase concreta crear, garantizan que una serie de objetos se instanciará en el orden correcto y que las clases correctas se pasarán a los constructores correctos cuando llame al new()
.
Por ejemplo, para un proyecto de MVVM en el que estoy trabajando, escribí una clase para asegurarme de que mi SetupView
se instanciara correctamente. Se ve algo como esto:
public class SetupViewFactory
{
public SetupView CreateView(DatabaseModel databaseModel, SettingsModel settingsModel, ViewUtilities viewUtilities)
{
var setupViewModel = new SetupViewModel(databaseModel, settingsModel, viewUtilities);
var setupView = new SetupView();
setupView.DataContext = setupViewModel;
return setupView;
}
}
Es confuso para llamar a esto una "fábrica"? No decide entre varias clases concretas posibles, y su tipo de devolución no es una interfaz o tipo abstracto, pero encapsula la instanciación de objetos.
Si no es una "fábrica", ¿qué es?
Editar
Varias personas han sugerido que este es en realidad el Builder.
La definición del Builder de dofactory es el siguiente:
independiente la construcción de un objeto complejo de su representación de manera que el mismo proceso de construcción pueden crear diferentes representaciones.
Esto también parece un poco exagerado. Lo que me molesta son las "diferentes representaciones". Mi propósito no es abstraer el proceso de construcción de una Vista (no es que esa no sea una meta digna). Simplemente trato de poner la lógica para crear una vista específica en un solo lugar, de modo que si alguno de los ingredientes o el proceso para crear esa vista cambian, solo tengo que cambiar esta clase. El patrón de construcción realmente parece decir: "Creemos un proceso general para crear Vistas, luego puede seguir el mismo proceso básico para cualquier Vista que cree". Bien, pero eso no es lo que estoy haciendo aquí.
Editar 2
Acabo de encontrar un ejemplo interesante en un Wikipedia article on Dependency Injection.
En "La dependencia inyectado de forma manual", que contiene la clase siguiente:
public class CarFactory {
public static Car buildCar() {
return new Car(new SimpleEngine());
}
}
Esto es casi exactamente el uso que tengo (y no, no he escrito el artículo de wiki :)).
Curiosamente, este es el comentario siguiente este código:
En el código anterior, la fábrica tiene la responsabilidad de montar el coche, e inyecta el motor en el coche. Esto libera al automóvil de saber cómo crear un motor, aunque ahora el CarFactory tiene que saber sobre la construcción del motor. Uno podría crear una EngineFactory, pero eso simplemente crea dependencias entre las fábricas. Así que el problema persiste, pero al menos se ha cambiado a fábricas, o constructores objetos. [mi énfasis]
Así que, esto me dice que al menos no soy el único que pensó en crear una clase para ayudar con la inyección de material en otra clase, y no soy el único que intentó para nombrar a esta clase como una fábrica.
No es nada quisquilloso, pero puede cambiar el nombre de su método a Create o CreateSetupView. – Mathias
Si eso es todo lo que intentas lograr, no se trata realmente de ninguno de los patrones, solo actualiza todo en alguna clase de nivel superior. Es incorrecto llamarlo una fábrica sí. – Chap
Suena como el patrón del constructor de instancias. –