Factory Method: crear objetos sin acoplar la decisión al flujo
Cómo Factory Method ayuda a encapsular la creación de objetos cuando el tipo concreto depende de contexto, canal o proveedor.
- #gof
- #factory-method
- #arquitectura
- #creacion-objetos
Resumen ejecutivo
- Factory Method sirve cuando crear un objeto ya es una decisión de arquitectura.
- El flujo gana estabilidad porque deja de conocer proveedores o clases concretas.
El problema real
El acoplamiento suele entrar por una línea inocente: new MercadoPagoClient(), new StripeClient(), new LocalNotifier(). Después aparecen más proveedores, más canales y más condiciones alrededor de la creación.
Cuando el flujo principal decide qué clase concreta instanciar, cada cambio de proveedor amenaza con tocar lógica que no debería cambiar.
Qué resuelve Factory Method
Factory Method encapsula la creación detrás de un método o función. El consumidor recibe una interfaz y no necesita conocer la clase concreta.
La decisión de creación sigue existiendo, pero queda ubicada en un punto explícito y testeable.
Cómo se ve en código
El flujo de pagos depende de un contrato. La selección del proveedor queda afuera.
type PaymentProvider = { charge(amount: number): Promise<void> };
function createPaymentProvider(country: string): PaymentProvider {
if (country === "AR") return new MercadoPagoProvider();
return new StripeProvider();
}
async function checkout(country: string, amount: number) {
const provider = createPaymentProvider(country);
await provider.charge(amount);
}Cuándo usarlo
Factory Method es útil cuando la creación depende de una decisión que probablemente cambie:
- El proveedor depende de país, tenant, canal o configuración.
- Querés testear el flujo con implementaciones falsas.
- La clase concreta requiere setup o credenciales específicas.
- Hay varios productos que cumplen el mismo contrato.
Cuándo evitarlo
Si siempre creás la misma clase y no hay variabilidad, una factory solo agrega indirección. Usala cuando la creación sea una decisión de arquitectura, no por costumbre.
Evidencia relacionada
FAQ
- ¿Factory Method es lo mismo que Abstract Factory?
- No. Factory Method crea un producto detrás de un contrato. Abstract Factory crea familias de productos relacionados que deben ser consistentes entre sí.
- ¿Una función factory alcanza?
- Muchas veces sí. En TypeScript o JavaScript, una función simple puede expresar Factory Method sin crear una jerarquía de clases innecesaria.