Factory Pattern: centralizar creación de objetos

Clase 17 de 27Curso de Patrones de Diseño y SOLID en Python

Resumen

Crear sin acoplarte a clases concretas es posible con el patrón creacional Factory Pattern. Aquí verás cómo centralizar la lógica de instanciación, apoyarte en interfaces, abstracciones o protocolos en Python, y elegir el objeto adecuado en cada caso de uso para ganar flexibilidad, escalabilidad y desacoplamiento.

¿Qué es el factory pattern y por qué usarlo?

El Factory Pattern crea objetos sin especificar la clase concreta. En lugar de eso, se apoya en interfaces o abstracciones para devolver instancias válidas según un parámetro de tipo (por ejemplo, un string). Así, encapsula la lógica de creación y ofrece una interfaz común para construir objetos.

  • Centraliza decisiones de creación en una sola clase factory.
  • Reduce acoplamiento: el código cliente no conoce clases concretas.
  • Facilita extensibilidad: integrar un nuevo procesador solo requiere ampliar la factory.
  • Mantiene consistencia: una única forma de crear instancias en todo el sistema.

¿Cuándo aplicarlo para crear objetos?

Úsalo cuando múltiples clases comparten una interfaz común y necesitas decidir cuál instanciar según el contexto. También resulta clave cuando la creación requiere múltiples decisiones (validaciones, parámetros, tipos), haciendo que sea conveniente encapsular esa complejidad.

¿Cómo se relaciona con el patrón strategy?

El patrón Strategy define múltiples estrategias, clases o funciones que resuelven el mismo problema con distintas soluciones. La Factory selecciona la estrategia correcta para el caso de uso adecuado, delegando la elección de la implementación concreta.

¿Qué problemas resuelve al escalar el sistema?

Cuando necesitas integrar un tercer procesador u otro nuevo, la lógica está centralizada en la factory. No cambias el código cliente; solo extiendes la factory para soportar el nuevo tipo.

¿Cómo implementarlo con una factory y un servicio de pagos?

Imagina un diagrama con una clase de alto nivel, PaymentService, que depende de PaymentFactory. La factory expone un método, getProcessor, que elige el procesador según un tipo (string) y devuelve la instancia correcta. De este modo, cualquier parte del código puede solicitar instancias a la factory para procesar pagos sin conocer detalles de creación.

¿Qué responsabilidades tienen paymentservice y paymentfactory?

  • PaymentService: orquesta el proceso de pago y deleg­a la elección del procesador a la factory.
  • PaymentFactory: contiene la lógica de decisión y el método getProcessor que devuelve el procesador correcto según el tipo.

¿Qué pasos seguir para aplicarlo?

  • Crear una clase Factory con un método que instancia y devuelve objetos basados en parámetros.
  • Encapsular la lógica de selección dentro de la factory (por ejemplo, por tipo).
  • Usar la factory en el código cliente para obtener instancias y mantener el desacoplamiento.
  • Extender la factory al integrar nuevos procesadores o features, sin modificar el cliente.

¿Has usado el Factory Pattern en tus proyectos? Cuéntame en comentarios cómo lo aplicaste y qué beneficios te dio.