Solución para controlar y desacoplar la creación de objetos en sistemas orientados a objetos. Uno de los tres grupos de patrones GoF junto con estructurales y de comportamiento.
Fundamentos del libro "Design Patterns: Elements of Reusable Object-Oriented Software"
Los patrones creacionales son uno de los tres grupos principales, junto con los estructurales y de comportamiento, definidos en el libro "Design Patterns: Elements of Reusable Object-Oriented Software" — la biblia del diseño OO.
¿Por qué no crear objetos directamente con new ClaseConscreta()?
El código cliente está acoplado directamente a clases concretas, dificultando el mantenimiento y la extensión del sistema.
new CardPayment() directamenteAbstraer y desacoplar la lógica de creación, permitiendo que el código cliente interactúe con interfaces abstractas en lugar de implementaciones concretas.
// ❌ SIN patrón — acoplado
class Checkout {
pay() {
return new CardPayment(); // 💥
}
}
// ✅ CON Factory Method — desacoplado
abstract class Checkout {
abstract Payment factoryMethod();
pay() {
Payment p = factoryMethod(); // ✅
return p.process();
}
}
process() que todos deben implementar.factoryMethod(). No sabe qué producto creará.process() con lógica de tarjeta vía API.factoryMethod() retornando new CardPayment().💡 Cambia el método arriba para ver cómo el UML se actualiza
¿Cuándo vale la pena aplicarlo?
Por qué usarlo en producción
Fácil de extender con nuevos tipos sin modificar código existente.
Cliente e implementación son completamente independientes.
Lógica de creación centralizada y compartida entre todos los ConcreteCreators.
Cambios localizados en un solo lugar. Modificar CardPayment no afecta PayPalPayment.
Cuándo puede no ser ideal
Añade capas. Para sistemas pequeños puede ser excesivo.
Excesivo cuando una sola clase concreta es suficiente.
Requiere tiempo inicial para nuevos desarrolladores.
Aplicando Factory Method a una tienda online real
Una tienda online necesita soportar múltiples métodos de pago y anticipa añadir nuevos. Crear instancias directamente acoplaría el código al cliente.
El cliente elige en runtime. Añadir CryptoPayment no toca código existente.
Creator factory;
if (method.equals("CARD"))
factory = new CardFactory();
else if (method.equals("PAYPAL"))
factory = new PayPalFactory();
else
factory = new CryptoFactory();
factory.someOperation(); // ✅
Cada rol tiene una responsabilidad única y bien definida
Define la estructura común de todos los objetos que se crearán.
Implementaciones específicas con su propia lógica, compartiendo la interfaz base.
Declara el factory method. No sabe qué clase concreta creará.
Decide qué producto instanciar y cómo hacerlo.
Usa el creator sin conocer las clases concretas. Cuando se necesita un nuevo tipo, no necesita cambiar.
Factory Method en perspectiva
10 preguntas en tiempo real. Cada grupo responde desde su celular — el más rápido y preciso gana.
factoryMethod()?100 pts