Command Palette

Search for a command to run...

ES·EN

Nivel 2 · 25 min

Patrones Creacionales

Los patrones creacionales resuelven cómo instanciar objetos de forma flexible y desacoplada. En lugar de usar new directamente, delegan la creación a métodos fábrica, clases fábrica o constructores fluidos. Los cinco patrones GoF creacionales son: Singleton, Factory Method, Abstract Factory, Builder y Prototype.

Singleton y Factory Method

Singleton garantiza una sola instancia de una clase y proporciona un punto de acceso global. El riesgo es que introduce estado global, dificulta el testing y puede ser un antipatrón cuando se usa para evitar inyección de dependencias. Factory Method define una interfaz para crear objetos pero deja a las subclases decidir qué clase instanciar — el creador no sabe qué clase concreta va a crear.

Abstract Factory y Builder

Abstract Factory crea familias de objetos relacionados sin especificar sus clases concretas — útil para themes de UI o drivers de base de datos intercambiables. Builder separa la construcción de un objeto complejo de su representación — permite construir el mismo tipo de objeto con diferentes configuraciones usando una cadena de métodos fluidos. Java usa Builder para StringBuilder, Lombok genera @Builder automáticamente.

Prototype

Prototype crea nuevos objetos copiando un objeto existente (prototipo). Útil cuando la creación es costosa y preferís clonar. En Java implementás Cloneable y override clone(). El riesgo es la copia superficial vs profunda — si el objeto tiene referencias, clone() las comparte por defecto. Jackson ObjectMapper.copy() es un ejemplo de factory con semántica de prototype.

Puntos clave

  • Factory Method y Abstract Factory desacoplan la creación del uso — el cliente trabaja con interfaces, no con clases concretas.
  • Builder resuelve el problema del constructor telescópico — preferilo cuando tenés más de 4 parámetros opcionales.
  • Singleton es legítimo para recursos verdaderamente únicos (driver de DB, registry); evitalo como sustituto de dependencias inyectadas.

Code example

// Builder pattern
Order order = Order.builder()
  .customerId("c-123")
  .item("SKU-A", 2)
  .priority(Priority.HIGH)
  .build();
// Abstract Factory
UIFactory factory = new DarkThemeFactory();
Button btn = factory.createButton();
Dialog dlg = factory.createDialog();