Patrón de Diseño Creacional · UNAB 2026

Patrones Creacionales FACTORY METHOD

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.

🏭 Creacional 📐 GoF ☕ Java 🏦 Sistema de Pagos
⚔️ Ir al reto
🔌
Productinterface Payment
🏗️
Creatorabstract class PaymentFactory
💳
ConcreteProductCardPayment, PayPal...
🏛️
ConcreteCreatorCardFactory, PayPalFactory
Desacoplado y ExtensiblefactoryMethod() en tiempo de ejecución
A · Definición
01/11

¿Qué son los Patrones de Diseño?

Fundamentos del libro "Design Patterns: Elements of Reusable Object-Oriented Software"

♻️
Soluciones Reutilizables
Patrones probados y documentados para problemas comunes en diseño de software orientado a objetos.
GoF · 1994
🏛️
Plantillas Arquitectónicas
Estructuras que pueden adaptarse a diferentes contextos y lenguajes de programación sin importar la plataforma.
Agnóstico de lenguaje
💬
Comunicación Efectiva
Vocabulario común entre desarrolladores. Decir "Factory Method" comunica inmediatamente la estructura del diseño.
Lenguaje universal
📚

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.

A · Problema
02/11

El Problema que resuelven

¿Por qué no crear objetos directamente con new ClaseConscreta()?

⚠ Situación inicial — Sin patrón

El código cliente está acoplado directamente a clases concretas, dificultando el mantenimiento y la extensión del sistema.

1Cliente crea new CardPayment() directamente
2Necesitan agregar PayPal → modificar cliente
3Necesitan crypto → modificar cliente otra vez
4Pruebas imposibles sin implementación real
Consecuencias del acoplamiento
  • Cambios en la creación requieren modificar múltiples partes del código
  • Imposibilidad de extender sin reescribir lógica existente
  • Violación del Principio de Responsabilidad Única
💡
La solución creacional

Abstraer 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();
  }
}
B · Estructura UML
03/11

Diagrama UML interactivo

Ver con método:
Roles del patrón
«INTERFACE»
Payment
Interfaz común. Define process() que todos deben implementar.
«ABSTRACT CLASS»
PaymentFactory
Declara factoryMethod(). No sabe qué producto creará.
«CONCRETE PRODUCT»
CardPayment
Implementa process() con lógica de tarjeta vía API.
«CONCRETE CREATOR»
CardFactory
Implementa factoryMethod() retornando new CardPayment().
«CLIENT»
Checkout
Usa el Creator. Nunca conoce clases concretas.
Método activo
💳 CardPayment
CardFactory → new CardPayment()

💡 Cambia el método arriba para ver cómo el UML se actualiza

C · Implementación Java
04/11

Código Java completo

Implementación:
src / pagos
🔌 Payment.javaInterface
🏭 PaymentFactoryAbstract
📦 CardPaymentProduct
🔧 CardFactoryCreator
🚀 Main.javaClient
Payment.java
💳 Card Java 17 GoF
1package pagos;
2
3public interface Payment {
4
5 // 🔑 El único método que el cliente necesita conocer
6 void process(double amount);
7
8 // Método de confirmación — devuelve ID de transacción
9 String getTransactionId();
10}
11
12// CardPayment, PayPalPayment y CryptoPayment la implementan
13// El cliente NUNCA ve esas clases concretas directamente.
1public abstract class PaymentFactory {
2
3 // 🔑 EL factory method — subclases deciden qué crear
4 public abstract Payment factoryMethod();
5
6 // ✅ Lógica del negocio — usa factoryMethod() sin saber qué retorna
7 public String processPayment(double amount) {
8 Payment payment = factoryMethod(); // ← delegación
9 payment.process(amount);
10 return payment.getTransactionId();
11 }
12}
13// Solo trabaja con la interfaz Payment — total desacoplamiento
1import .
2import .;
3
4public class CardPayment implements Payment {
5 private String transactionId;
6 private final String cardNumber;
7
8 @Override
9 public void process(double amount) {
10 // Conecta a la API de Bancolombia 💳
11 Charge charge = Charge.create(Map.of(
12 "amount", (long)(amount * 100),
13 "currency", "usd",
14 "source", cardNumber));
15 transactionId = charge.getId(); // ch_3MqLiJLk...
16 }
17
18 @Override
19 public String getTransactionId() { return transactionId; }
20}
1public class CardFactory extends PaymentFactory {
2
3 private final String cardNumber;
4 private final String cvv;
5
6 @Override
7 public Payment factoryMethod() {
8 // 🔑 Solo aquí existe el "new CardPayment()"
9 return new CardPayment(cardNumber, cvv);
10 }
11}
1public class Main {
2 public static void main(String[] args) {
3
4 // El cliente solo conoce PaymentFactory (abstracto)
5 PaymentFactory factory;
6
7 // Selección en runtime — aquí podría venir de config/BD
8 String method = getMethodFromUser(); // "CARD" / "PAYPAL" / "CRYPTO"
9
10 switch (method) {
11 case "CARD" → factory = new CardFactory(cardNum, cvv);
12 case "PAYPAL" → factory = new PayPalFactory(token, email);
13 case "CRYPTO" → factory = new CryptoFactory(wallet, creds);
14 defaultthrow new IllegalArgumentException(method);
15 }
16
17 // ✅ El cliente llama al Creator abstracto — NO a clases concretas
18 String txId = factory.processPayment(415.31);
19 System.out.println("✓ Pago aprobado · TX: " + txId);
20 }
21}
22// Solo se agregan nuevas Factory y Payment — OCP cumplido
Java 17+
GoF Creacional
OCP / SRP / DIP
💡 CardPayment usa API internamente
A · Análisis
05/11

Ventajas y Desventajas

¿Cuándo vale la pena aplicarlo?

✅ Ventajas principales

Por qué usarlo en producción

🔌
Flexibilidad

Fácil de extender con nuevos tipos sin modificar código existente.

✂️
Desacoplamiento

Cliente e implementación son completamente independientes.

♻️
Reutilización

Lógica de creación centralizada y compartida entre todos los ConcreteCreators.

🔧
Mantenibilidad

Cambios localizados en un solo lugar. Modificar CardPayment no afecta PayPalPayment.

⚠️ Consideraciones

Cuándo puede no ser ideal

📁
Complejidad adicional

Añade capas. Para sistemas pequeños puede ser excesivo.

🔨
Over-engineering

Excesivo cuando una sola clase concreta es suficiente.

📈
Curva de aprendizaje

Requiere tiempo inicial para nuevos desarrolladores.

Regla de oro: Úsalo cuando el sistema evoluciona y hay múltiples variantes creadas dinámicamente.
D · Caso Práctico
06/11

Caso Práctico: Sistema de Pagos

Aplicando Factory Method a una tienda online real

⚠️ El Problema

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.

📐 Estructura con Factory Method

ClientUsa el patrón
↓ llama a
PaymentFactory (Creator)Abstracto
↓ extiende
CardFactoryConcreteCreator
↓ crea
CardPayment (Product)ConcreteProduct
Métodos de pago disponibles
💳
CardPaymentCardFactory → factoryMethod()
🅿️
PayPalPaymentPayPalFactory → factoryMethod()
CryptoPaymentCryptoFactory → factoryMethod()
Nuevo
✅ Principio Abierto-Cerrado (OCP)

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(); // ✅
B · Componentes
07/11

Los 5 Componentes del patrón

Cada rol tiene una responsabilidad única y bien definida

🔌
Payment (Interfaz)
interface Payment

Define la estructura común de todos los objetos que se crearán.

🧩
Concrete Product
CardPayment / PayPalPayment / CryptoPayment

Implementaciones específicas con su propia lógica, compartiendo la interfaz base.

🏗️
Creator (Abstracto)
abstract class PaymentFactory

Declara el factory method. No sabe qué clase concreta creará.

🏭
Concrete Creator
CardFactory / PayPalFactory / CryptoFactory

Decide qué producto instanciar y cómo hacerlo.

👤
Client (Checkout)
Main.java

Usa el creator sin conocer las clases concretas. Cuando se necesita un nuevo tipo, no necesita cambiar.

A · Conclusión
08/11

Conclusión

Factory Method en perspectiva

01
🔌 Flexibilidad
Los patrones creacionales permiten construir sistemas que evolucionan sin modificar código existente. Agregar CryptoPayment no toca nada del cliente.
02
✂️ Desacoplamiento
Separan la creación de objetos de su uso, mejorando la modularidad y testabilidad. Cada Creator puede probarse independientemente.
03
🔧 Mantenibilidad
Centralizan la lógica de creación, facilitando cambios y extensiones futuras. Un cambio en CardPayment no rompe nada más.
Los patrones creacionales son herramientas esenciales en la caja de herramientas del ingeniero de sistemas. Cuando se identifica la necesidad de controlar dinámicamente la creación de objetos, proporcionan una arquitectura robusta, escalable y conforme a los principios del diseño orientado a objetos.
Demo · Factory Method en acción
Interfaz del cliente
Checkout · PayFlow
No conoce implementaciones concretas
🎧
Sony · Electronics
WH-1000XM5
Auriculares inalámbricos con cancelación de ruido
$349.00
$399.00
Ahorras $50
Resumen del pedido
Sony WH-1000XM5 × 1$349.00
Envío estándarGratis
IVA 19%$66.31
Total$415.31
Método de pago
💳
Tarjeta de crédito
CardFactory · CardPayment
Recomendado
🅿️
PayPal
PayPalFactory · PayPalPayment
Criptomoneda (BTC)
CryptoFactory · CryptoPayment
Nuevo
🔒Cifrado TLS 1.3 · PCI DSS Level 1
Patrón Factory Method
Delegación dinámica
Cada paso se pausa y explica exactamente qué ocurre
👤
Client
Checkout.java
iniciando
processPayment( "CARD" )
llama al Creator abstracto
🏭
Creator · Abstract
PaymentFactory
delegando
factoryMethod() : Payment
delega a ConcreteCreator
🔧
ConcreteCreator
CardFactory
instanciando
return new CardPayment()
crea e instancia el producto
📦
ConcreteProduct · «Payment»
CardPayment
ejecutando
process() → cargo vía API
Traza de ejecución
Log en tiempo real
Cada paso documentado
📋
Esperando ejecución
Elige un método y haz clic en "Pagar" para ver el patrón paso a paso
E · Reto
10/11

⚔️ Arena de Competencia

RETO
FACTORY

10 preguntas en tiempo real. Cada grupo responde desde su celular — el más rápido y preciso gana.

10
Preguntas
+
Velocidad
Grupos
⚔️ Abrir arena →
Vista previa — preguntas
MCQ¿Qué retorna siempre el factoryMethod()?100 pts
MCQ¿Por qué Creator declara factoryMethod() como abstract?100 pts
CÓDIGOIdentifica el error en Creator base200 pts
MCQ¿Cuál es el rol del ConcreteCreator?100 pts
CÓDIGOCompleta factoryMethod() en CryptoFactory200 pts
CASO¿Es Factory Method correcto para notificaciones?150 pts
MCQ¿Qué principio SOLID aplica directamente?150 pts
CÓDIGOEncuentra el bug: cliente usa new ConcreteCreatorA()250 pts
MCQ¿Cuándo NO usar Factory Method?150 pts
FINALDiseña Factory Method para notificaciones de UnaPlus300 pts
1
Paso 1 de 5
Título
¿Por qué importa?

← →navegarHomeinicioEndfinal