¿Cómo implementar el Patrón Factory Method en JavaScript?
El Patrón Factory Method es una solución ideal para la creación de objetos cuando tienes una jerarquía de clases. Este patrón evita la necesidad de especificar la clase exacta de los objetos que se producen al delegar la responsabilidad de la creación a sus subclases. Te conduce a un código más limpio y flexible, permitiendo que las estructuras se adapten fácilmente a futuros cambios. Veamos cómo implementar este patrón en JavaScript paso a paso.
¿Cuál es el primer paso para implementar el patrón?
-
Declaración de un producto base:
Para comenzar, debes declarar una clase base o interfaz que será retornada por la clase Factory y sus subclases. En el ejemplo del curso, se usa una clase BaseCar
que cuenta con un método que no está implementado.
class BaseCar {
showCost() {
throw new Error('Method not implemented');
}
}
Esta estructura alienta el uso de métodos abstractos, muy comunes en programación orientada a objetos, que definen la firma pero no la implementación del método.
¿Cómo se implementan los productos concretos?
-
Definición de subclases concretas:
Una vez creada la clase base, se procede a implementar productos concretos que heredan de esta clase. Estas subclases deben sobrescribir el método abstracto.
class MastodonCar extends BaseCar {
showCost() {
console.log('Mastodon Car Cost: 300,000 pesos mexicanos');
}
}
class RhinoCar extends BaseCar {
showCost() {
console.log('Rhino Car Cost: 100,000 pesos mexicanos');
}
}
Esta etapa establece un enlace directo entre las clases específicas de los productos y la clase base.
¿Cuál es el papel de la clase Factory?
-
Declaración de la clase Factory:
Una clase Factory o interfaz debe crear objetos que coincidan con el producto base. Este es el esqueleto que obliga a sus subclases a implementar un método específico.
class CarFactory {
makeCar() {
throw new Error('Method not implemented');
}
}
Esto fortalece el concepto de polimorfismo, donde se espera que las subclases implementen este método con su lógica particular.
¿Cómo se crean las fábricas concretas?
-
Implementación de fábricas concretas:
Las fábricas concretas extienden la clase base de la fábrica, retornando productos específicos.
class MastodonCarFactory extends CarFactory {
makeCar() {
return new MastodonCar();
}
}
class RhinoCarFactory extends CarFactory {
makeCar() {
return new RhinoCar();
}
}
Así se establece el puente entre las clases productoras y los productos concretos, dentro del patrón Method Factory.
¿Cómo se probó el patrón en la práctica?
Para demostrar el funcionamiento de esta estructura, se mostró cómo crear una aplicación que recibe una fábrica y produce el producto correspondiente, sin conocer de antemano qué tipo de fábrica utiliza.
function appFactory(factory) {
const car = factory.makeCar();
car.showCost();
}
appFactory(new MastodonCarFactory());
appFactory(new RhinoCarFactory());
Aquí, la función appFactory
es capaz de trabajar con cualquier variación de la fábrica, gracias a la uniformidad en la interfaz que provee el patrón.
¿Es posible una mejora creativa dentro del patrón Factory Method?
El instructor sugiere una sofisticación más, creando una función createFactory
que extienda la versatilidad para crear fábricas basadas en strings.
function createFactory(type) {
const factories = {
Mastodon: MastodonCarFactory,
Rhino: RhinoCarFactory
};
const Factory = factories[type];
return new Factory();
}
appFactory(createFactory('Mastodon'));
appFactory(createFactory('Rhino'));
Esta abstracción permite expandir el código sin dificultad, simplemente añadiendo más tipos al objeto factories
.
Reflexión final: ¿Qué aprendiste?
Implementar el Patrón Factory Method no solo refuerza los conceptos de programación orientada a objetos como la herencia y el polimorfismo, sino que también promueve la creatividad en el diseño de software. Añade una herramienta poderosa a tu repertorio, lista para usarse en problemas que requieran la creación flexible y extensible de objetos. ¿Qué otras aplicaciones creativas imaginas que podría tener este patrón en tus futuros proyectos?
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?