Front & Back

Blog sobre el Desarrollo de aplicaciones web

Back end El patrón Abstract Factory

Desde hace algunos días estoy leyendo bastante sobre distintos patrones de diseño. Los patrones no son más que soluciones comunes aplicadas a problemas recurrentes que surgen de forma habitual durante el desarrollo de software. La identificación y catalogación de estos paradigmas, ayuda a la comunidad de desarrolladores a no reinventar la rueda, pues ofrecen soluciones elegantes a problemas complejos. En el libro “Design Patterns” de Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides (que he empezado a leer y recomiendo encarecidamente) estos patrones están catalogados en tres categorías:

- De creación.
- Estructurales.
- De comportamiento.

En este post voy a centrarme en “Abtract Factory” un patrón que pertenece a la primera categoría. Los patrones de creación describen arquitecturas pensadas para abstraer la creación de instancias, haciendo independiente a un sistema de la creación y manejo de los objetos que lo componen.

Abstract Factory

Las factorías abstractas se componen de una clase padre a partir de la cual se generan clases concretas que heredan su funcionalidad e implementan nuevos métodos o modifican los existentes. Mediante este patrón podremos crear distintas familias de objetos que parten de una base común.

Para explicar esto con más detalle, he tomado como punto de partida el estupendo repositorio DesignPaternsPHP de Dominik Lieber donde facilita ejemplos de implementación para muchos de los patrones más conocidos. Concretamente en el directorio AbstractFactory encontraréis el código en el que me he basado para diseñar siguiente diagrama OMT:


Diagrama OMT del patrón Abstract Factory

Para interpretar el diagrama, tendremos que tener en cuenta que:
- Los cuadros divididos en dos partes representan cada una de las clases que intervienen en la implementación y los métodos que contiene.
- “Cliente” se incluye par indicar que éste interviene dentro del propio patrón. En este caso sólo usará interfaces declaradas por AbstractFactory, HtmlFactory o JsonFactory.
- La flecha con el triángulo en blanco indica que las clases inferiores están extendidas de la superior.
- La flecha discontinua indica que una clase crea instancias de otra.

El ejemplo implementa una factoría abstracta a partir de la cual se generan factorías concretas. En este caso la factoría es la base para la creación de dos tipos de componentes web; texto e imagen, pudiéndose renderizar como HTML o JSON.

Vamos a echar un vistazo a los componentes que intervienen en este ejemplo:

AbstractFactory

Contiene la definición de dos métodos abstractos, createText y createPicture, que serán utilizados en todas las clases concretas que extiendan la factoría. El primero recibe un parámetro ($content) mientras que el segundo necesita de dos ($path y $name)

HtmlFactory y JsonFactory

Esta clases concretas son las encargadas de recibir los parámetros tal como se especifica en la factoría abstracta y renderiza el dato según corresponda. Vemos que recibiendo los mismos parámetros y constando de la misma estructura cada una de ellas devuelve los datos de forma distinta.

Picture y Text

Vemos que en el ejemplo la funcionalidad de createText() y createPicture() se ha delegado en clases contenidas en directorios diferenciados, supongo que por mera organización aunque podrían haberse implementado en las propias clases concretas.

Conclusiones

- Se ha encapsulado el proceso de creación de objetos.
- Se ha creado un entorno para facilitar la creación de nuevos componentes que extiendan la funcionalidad de la clase abstracta.
- Una clara desventaja sin embargo es que cuando se necesiten crear nuevos clases concretas que contengan nuevas funciones, habrá que extender la Factoría abstracta y el resto de subclases que utilizan su interfaz.