¿Cómo implementar el patrón AbstractFactory en JavaScript?
El patrón AbstractFactory es una robusta herramienta para la creación de familias de objetos relacionados. En este artículo, presentamos la implementación práctica de este patrón orientado a objetos en JavaScript, destacando su poder para disminuir el acoplamiento entre el código cliente y las instancias de los productos.
¿Cómo definir las clases base de los productos?
Para arrancar con el AbstractFactory, es fundamental definir las clases o interfaces de los productos base. En este caso, definimos dos productos: Mastodon y Rhino. Cada producto implementa un método useGPS, lo que garantiza que las implementaciones futuras deban realizar este método.
classMastodonCard{useGPS(){thrownewError("method not implemented");}}classRhinoCard{useGPS(){thrownewError("method not implemented");}}
¿Cómo creamos las clases concretas de los productos?
El siguiente paso es establecer las clases concretas de los productos, que heredan de las clases base. Aquí creamos dos familias de vehículos: Sedan y Hatchback. Cada familia tiene su correspondiente implementación para Mastodon y Rhino.
classMastodonSedanCardextendsMastodonCard{useGPS(){console.log("Sedan Mastodon GPS");}}classRhinoSedanCardextendsRhinoCard{useGPS(){console.log("Sedan Rhino GPS");}}// Implementaciones similares para Hatchback
¿Qué es el abstract factory?
Posteriormente, se define el abstract factory, que establece un contrato para la creación de nuestras instancias de producto.
classAbstractFactory{createMastodon(){thrownewError("method not implemented");}createRhino(){thrownewError("method not implemented");}}
¿Cómo implementar las fábricas concretas?
La clave del patrón está en las fábricas concretas que heredan del abstract factory. Definen las específicas versiones de los productos dentro de una familia.
classSedanCarFactoryextendsAbstractFactory{createMastodon(){returnnewMastodonSedanCard();}createRhino(){returnnewRhinoSedanCard();}}// Implementación similar para Hatchback
¿Cómo utilizar el patrón abstract factory?
Al emplear el patrón AbstractFactory, se inyecta la fábrica deseada, permitiendo crear objetos sin conocer su precisa clase. En el siguiente ejemplo utilizamos la fábrica Sedan y la Hatchback, y llamamos al método useGPS() de modo genérico.
¿Qué podemos concluir sobre la implementación en JavaScript?
Esta implementación del patrón AbstractFactory demuestra cómo se pueden crear distintos tipos de objetos relacionados sin comprometer el código cliente con clases específicas. Este patrón facilita que el diseño del software sea flexible, manejable y extensible.
Comparación con TypeScript y otras consideraciones
En proyectos complejos, utilizar TypeScript puede ofrecer ventajas adicionales, como la verificación temprana de tipos que ayudan a detectar errores. Continuaremos explorando las particularidades y beneficios de implementar este patrón en TypeScript en futuras entregas.
Esta metodología no sólo ilustra un claro entendimiento de los patrones de diseño, sino que también se erige como una herramienta esencial en el arsenal de cualquier desarrollador. Te animo a que implementes este patrón en tus propios proyectos y descubras por ti mismo sus beneficios. ¡Continúa aprendiendo y mejorando tus habilidades!
Implementación del patrón Abstract Factory en JavaScript
Implementación del patrón Abstract Factory en JavaScript
Recursos
Resumen
¿Cómo implementar el patrón AbstractFactory en JavaScript?
El patrón AbstractFactory es una robusta herramienta para la creación de familias de objetos relacionados. En este artículo, presentamos la implementación práctica de este patrón orientado a objetos en JavaScript, destacando su poder para disminuir el acoplamiento entre el código cliente y las instancias de los productos.
¿Cómo definir las clases base de los productos?
Para arrancar con el AbstractFactory, es fundamental definir las clases o interfaces de los productos base. En este caso, definimos dos productos: Mastodon y Rhino. Cada producto implementa un método useGPS, lo que garantiza que las implementaciones futuras deban realizar este método.
class MastodonCard {
useGPS() {
throw new Error("method not implemented");
}
}
class RhinoCard {
useGPS() {
throw new Error("method not implemented");
}
}
¿Cómo creamos las clases concretas de los productos?
El siguiente paso es establecer las clases concretas de los productos, que heredan de las clases base. Aquí creamos dos familias de vehículos: Sedan y Hatchback. Cada familia tiene su correspondiente implementación para Mastodon y Rhino.
class MastodonSedanCard extends MastodonCard {
useGPS() {
console.log("Sedan Mastodon GPS");
}
}
class RhinoSedanCard extends RhinoCard {
useGPS() {
console.log("Sedan Rhino GPS");
}
}
// Implementaciones similares para Hatchback
¿Qué es el abstract factory?
Posteriormente, se define el abstract factory, que establece un contrato para la creación de nuestras instancias de producto.
class AbstractFactory {
createMastodon() {
throw new Error("method not implemented");
}
createRhino() {
throw new Error("method not implemented");
}
}
¿Cómo implementar las fábricas concretas?
La clave del patrón está en las fábricas concretas que heredan del abstract factory. Definen las específicas versiones de los productos dentro de una familia.
class SedanCarFactory extends AbstractFactory {
createMastodon() {
return new MastodonSedanCard();
}
createRhino() {
return new RhinoSedanCard();
}
}
// Implementación similar para Hatchback
¿Cómo utilizar el patrón abstract factory?
Al emplear el patrón AbstractFactory, se inyecta la fábrica deseada, permitiendo crear objetos sin conocer su precisa clase. En el siguiente ejemplo utilizamos la fábrica Sedan y la Hatchback, y llamamos al método useGPS() de modo genérico.
function appCarFactory(factory) {
const mastodon = factory.createMastodon();
const rhino = factory.createRhino();
mastodon.useGPS();
rhino.useGPS();
}
const sedanFactory = new SedanCarFactory();
appCarFactory(sedanFactory);
const hatchbackFactory = new HatchbackCarFactory();
appCarFactory(hatchbackFactory);
¿Qué podemos concluir sobre la implementación en JavaScript?
Esta implementación del patrón AbstractFactory demuestra cómo se pueden crear distintos tipos de objetos relacionados sin comprometer el código cliente con clases específicas. Este patrón facilita que el diseño del software sea flexible, manejable y extensible.
Comparación con TypeScript y otras consideraciones
En proyectos complejos, utilizar TypeScript puede ofrecer ventajas adicionales, como la verificación temprana de tipos que ayudan a detectar errores. Continuaremos explorando las particularidades y beneficios de implementar este patrón en TypeScript en futuras entregas.
Esta metodología no sólo ilustra un claro entendimiento de los patrones de diseño, sino que también se erige como una herramienta esencial en el arsenal de cualquier desarrollador. Te animo a que implementes este patrón en tus propios proyectos y descubras por ti mismo sus beneficios. ¡Continúa aprendiendo y mejorando tus habilidades!
No logró pensar en donde podría aplicar yo este patrón, en algunos empleos lo piden, pero como se vio en el curso anterior quizá es una exageración el pedirlo.
Pero con este patrón si entendí algo, los desarrolladores de zomboid son expertos en POO, porque puedo ver como este patrón ayudo a plantear ciertas mecánicas de ese videojuego, por ejemplo el "nuevo" sistema de autos en zomboid está claramente basado en este tipo de factories y zomboid es un juego mucho más complejos a nivel de mecánicas que la mayoría de juegos del mismo tipo.
En lo personal este patrón no me encanta. Factory ya usaba una capa de abstracción y este agrega otra capa (lo cuál lo hace complejo).
Además de eso, para agregar un producto nuevo (un coche en este caso), se necesitan agregar muchas cosas:
La creación del coche que siga el contrato de BaseCar (por cierto, no se agrego un BaseCar en el ejemplo de esta clase)
La creación de cada uno de los modelos de nuevo coche (Sedan y Hatchback en este caso)
Agregar un nuevo método en AbstractFactory para el nuevo producto
Agregar polimorfismo a cada subfactory del nuevo producto (SedanModelFactory & HatchbackModelFactory)
.
Son muchas cosas para agregar un nuevo producto. Aunque la buena noticia es que se siguen cumpliendo los principios de Responsabilidad Unica y de Open-Close
En el paso 4 noté que faltó heredar de la clase CarAbstractFactory para cumplir con lo que nos dice este paso: Create concrete factories that implements/inherits from the abstract factory behaviour and implements all the products creation methods.
hola tengo una pregunta,¿ las constantes se crean en un entonrno local, entonces como la appCarFactory se llama 2 veces, tendriamos 2 contantes llamadas rino y 2 llamadas mastodont, cada par rinho mastodont en un contexto local? como podria acceder a cada producto particular creado en cada llamada del appCarFactory?
Un poco díficil de entender en la última parte, en particular en el siguiente fragmento de código:
function createFactory(type) {
// ....
const Factory = factories[type];
return new Factory();
}
```Creo que se debe especificar que la constante Factory, ahora contiene una referencia a la clase o función constructora que fue seleccionada en el paso anterior. Luego se crea una nueva instancia de esa clase o función constructora usando `new Factory()`.