Patrón Factory Method
El patrón Factory Method define una interfaz para crear objetos pero deja que las subclases decidan qué clase instanciar. Úsalo cuando quieras desacoplar la creación de objetos de su uso, facilitando extender o intercambiar implementaciones sin modificar el código cliente.
Resumen
El patrón Factory Method define un método para crear un objeto, pero delega la elección de la clase concreta a subclases (o estrategias). El código cliente habla con el tipo base y nunca nombra a la clase concreta, así que agregar una variante nueva es cuestión de enchufar una nueva factoría — sin tocar a los consumidores.
Cuándo usarlo
- El código cliente no debe depender de la clase concreta que instancia.
- Esperas nuevas variantes de producto con el tiempo y quieres aislar cada una en su propia factoría.
- La creación requiere lógica (lookup de config, validación, registro) que no pertenece al consumidor.
Ejemplo
interface Transport {
deliver(load: string): void;
}
class Truck implements Transport {
deliver(load: string) { console.log(`Camión entrega ${load}`); }
}
class Ship implements Transport {
deliver(load: string) { console.log(`Barco entrega ${load}`); }
}
abstract class Logistics {
abstract createTransport(): Transport;
planDelivery(load: string) {
const transport = this.createTransport();
transport.deliver(load);
}
}
class RoadLogistics extends Logistics {
createTransport() { return new Truck(); }
}
class SeaLogistics extends Logistics {
createTransport() { return new Ship(); }
}Ventajas
- Desacopla al cliente de las clases concretas — principio open/closed en acción.
- Centraliza la lógica de construcción, así que los cambios ocurren en un solo lugar.
- Facilita intercambiar implementaciones en runtime o por entorno.
Desventajas
- Agrega una capa extra de clases e indirección, que puede sentirse pesada en casos pequeños.
- Las factorías por subclase pueden generar jerarquías paralelas difíciles de seguir.
- Si solo vas a tener una variante, este patrón es sobreingeniería.