Patrones de diseño en Flutter: un enfoque práctico con Factory Method

Albert Joao Jimenez
Pragma
Published in
5 min readApr 12, 2024
Pragma — chapter mobile

Flutter, basado en el lenguaje Dart, se destaca por su flexibilidad y capacidad para aplicar principios de programación orientada a objetos, como los principios SOLID. Estos fundamentos permiten desarrollar soluciones móviles robustas y eficientes. En este artículo, exploraremos el patrón de diseño Factory Method, una herramienta clave en la caja de herramientas de un desarrollador Flutter. A través de mi experiencia, mostraré cómo este patrón puede facilitar la creación de objetos en aplicaciones, asegurando una estructura de código que es tanto clara como adaptable a los cambios. Si bien existen diversas formas de implementar patrones de diseño, el objetivo aquí es presentar una perspectiva práctica sobre el uso del Factory Method en el desarrollo de aplicaciones móviles con Flutter, fomentando un enfoque que beneficia tanto el trabajo individual como colaborativo.

Representación de un cliente solicitando la creación de una app

Caso problema:

Imagina que gestionas el desarrollo de una app para una popular cadena de heladerías. El negocio ofrece una variedad de helados a base de agua o leche, con la adición de frutas y, opcionalmente, azúcar. La central recibe información sobre estos helados a través de terminales que envían los datos en formato JSON. Nuestro desafío es diseñar una solución que permita a la aplicación interpretar estos datos JSON variados y crear objetos de helado correspondientes de manera eficiente y sin errores. ¿Cómo podemos asegurarnos de que la app pueda manejar la diversidad de helados con un código que sea fácil de mantener y extender? Aquí es donde el patrón Factory Method entra en juego, ofreciéndonos una forma elegante de abstraer la complejidad del proceso de creación de objetos a partir de datos estructurados.

Paso a paso de la solución implementada:

Tras analizar los requerimientos de nuestro cliente, concluimos que los diversos tipos de helado podrían ser tratados como una familia de objetos relacionados. Aunque comparten muchas características, su proceso de creación varía, especialmente al ser instanciados desde datos JSON. Para liberar a los desarrolladores de la complejidad de este proceso y garantizar una creación de objetos consistente a lo largo de la aplicación, implementamos una clase abstracta IceCreamModel. Esta clase sirve como una interfaz común para todos los helados, definiendo una estructura estándar que incluye el nombre y una lista de ingredientes. De esta manera, IceCreamModel establece el contrato que todas nuestras subclases de helados seguirán, asegurando que independientemente de su tipo específico, todos sean creados siguiendo un protocolo uniforme y coherente.

uml para la implementación del factory method en nuestro caso problema

Para mantener nuestro proyecto de Flutter limpio y manejable, estructuramos las carpetas de la capa de dominio con un enfoque en la lógica de negocio, utilizando clases pequeñas y cohesivas. Dentro de ‘domain’, tenemos ‘enums’ que albergan IngredientsEnum, definiendo los posibles ingredientes de nuestros helados. En ‘interfaces’, ubicamos IceCreamModel, nuestra clase abstracta que dicta la estructura común de todos los helados. Finalmente, ‘models’ contiene MilkBasedIceCream y WaterBasedIceCream, las cuales concretizan el patrón Factory Method permitiendo la creación de diferentes tipos de helados. Esta organización facilita la expansión y mantenimiento del código, ya que cada pieza está bien definida y aislada, lo que simplifica la adición de nuevos tipos de helados en el futuro y mantiene la implementación del patrón Factory coherente y centralizada.

La clase MilkBasedIceCream, al extender IceCreamModel, cumple con el patrón Factory Method al definir un conjunto específico de ingredientes para este tipo de helado. Aunque actualmente esta clase modela la estructura de datos necesaria para la creación de objetos IceCreamModel, la lógica para su serialización y deserialización se delegará a un componente especializado. Esta separación de responsabilidades no solo es una práctica de diseño recomendada, sino que también prepara el terreno para futuras mejoras. En pasos siguientes, veremos cómo esta clase puede ser ampliada para manejar la conversión entre JSON y objetos IceCreamModel de manera más eficiente, manteniendo la integridad y la coherencia del modelo de datos.

Nuestra clase WaterBasedIceCream refina aún más el patrón Factory Method.

factory WaterBasedIceCream.fromJson(Map<String, dynamic> json)

A través de su constructor de fábrica fromJson, posibilita que los objetos IceCreamModel se creen directamente desde datos JSON, dotando a los desarrolladores de la flexibilidad para definir el nombre del helado dinámicamente. Además, la inclusión del método toJson prepara la clase para interactuar eficientemente con bases de datos, anticipando una escalabilidad que será fundamental cuando abordemos patrones más avanzados como el Abstract Factory. Este avance no solo simplifica el proceso de creación y manejo de objetos, sino que también alinea la clase WaterBasedIceCream con futuras extensiones y mejoras en el diseño de nuestra aplicación.

Conclusion:

El patrón Factory Method es una herramienta poderosa en nuestro arsenal de desarrollo, permitiéndonos construir aplicaciones con componentes que son robustos, escalables y mantenibles. Establece un marco claro para la creación de objetos, asegurando la coherencia mientras preserva la flexibilidad esencial para la interactividad y el crecimiento del proyecto. Este patrón no solo brilla por sí solo, sino que también complementa y se integra sin problemas con otros patrones de diseño, sentando las bases para arquitecturas más complejas y sofisticadas.

Para continuar tu viaje de aprendizaje y descubrir cómo puedes aplicar y combinar el patrón Factory Method en tus proyectos de Flutter, explora los siguientes recursos:

https://refactoring.guru/design-patterns/factory-method
Diseñando con Elegancia: Explorando el Patrón Factory en Programación : Un video donde profundizamos la implementación del patron Factory para dummies
Explorando Patrones Creacionales en Flutter: Complemento al Patrón Factory (Dart vs other) :) un video donde analizamos en un vs con algunos otros lenguajes de programación la implementación del patron Factory method

--

--

Albert Joao Jimenez
Pragma
Writer for

Desarrollador de soluciones móviles en Flutter/Dart con +20 años de experiencia. Apasionado del arte y la tecnología. Tengo 5 gatos 🐱.