Este patrón pertenece al grupo de los creacionales, junto con el Factory y el Singleton, de los cuales hemos hablado en otros post. Podemos empezar por decir que si lo compramos con el Factory, podrían resultar muy parecidos, ya que ambos se concentran en el proceso de crear instancias de objetos, para que sean usadas por otros. Sin embargo el Factory se concentra en el QUE se está creando, mientras que el Builder se concentra en él COMO.
En el ejemplo que publique del Factory se creaban Páginas web de diferentes tipos, aquí el QUE es la página en sí, que se define por un tipo. En realidad la implementación de las páginas era responsabilidad de cada una de las clases específicas que derivaban de una clase abstracta, que definía los requerimientos mínimos reutilizables. El Factory se limitaba a crear las instancias especificas y devolverlas a quien la solicito. O sea él COMO no estaba centralizado, más bien se codificaba en cada página.
En el patrón Builder, él COMO se implementa el QUE, debe quedar centralizado en un solo punto dentro del código. De tal forma que al solicitar una página este método constructor se encargue de ensamblar las partes que formaran la página. Absorbiendo la responsabilidad de determinar las partes que contendrá, de tal suerte que la pagina es el objeto resultante de un proceso de ensamblado, donde el objeto no tiene conocimiento de cómo se arma el mismo.
La mejor forma de entenderlo es con código, así que continuando con el mismo ejemplo de las páginas que use en el Factory, ahora implementaremos una clase que creara páginas web, armando sus partes, en un solo punto.
Requerimientos
Actualmente me encuentro asesorando a unos clientes, en el desarrollo de un sitio web. Desde el principio se diseño la arquitectura del mismo para que pudiera ser lo más reutilizable posible, por lo que hemos implementado patrones y técnicas para desarrollar un Framework de las aplicaciones que forma parte del sitio. Durante el diseño del proyecto detectamos la necesidad de un Componente muy especial que sirviera como Coordinador de la creación de las páginas del sitio. El ejemplo es el primer test para crear dicho coordinador usando el patrón Builder con ayuda del patrón Factory.
Análisis
Cada página tiene una plantilla relacionada a ella, la cual define las áreas con las que cuenta, cada área puede contener un solo Control. Es necesario crear un componente que sea capaz de crear la página para que pueda ser usada, según el nivel en el cual se encuentre el usuario.
Ejemplo:
Como todo buen patrón empezamos con las interfaces, una para la plantilla, una para el área y otra para elementos:
Para cada una de estas interfaces se debe crear una clase abstracta que implemente las propiedades establecidas en la interface correspondiente:
(Por simplificación, aquí solo presentare la de Template, pero es necesario hacer lo mismo con las otras dos).
En este punto podemos crear las clases específicas que deriven de las clases abstractas. Por ejemplo si tenemos 5 diferentes tipos de Template, se deben crear 5 clases que deriven de la clase abstracta de Template:
Ahora podemos crear la clase que se devolverá, con la implementación especifica:
A partir de este momento empezaremos a codificar nuestro patrón Builder, con el apoyo del patrón Factory.
Nuestro patrón Builder necesita una clase abstracta donde se defina el método para construir la instancia, después veremos el uso especial que le daremos a esta clase:
También debemos codificar una clase Constructora especifica, esta clase implementara otro patrón el cual no habíamos usado previamente, me refiero al patrón Estrategia, el cual nos permite determinar de forma dinámica como responderá nuestra clase, según se establezca:
Como recordaran al principio comentamos que este patrón se concentraba en el cómo, por lo que es necesario crear una clase específica para cada implementación que deseemos realizar, la cual debe derivar de la clase base que definimos previamente:
Esto se debe llevar a cabo por cada página que queramos construir; por ejemplo si hubiera una página Detail, se debería crear una clase para esta página también:
Por último usaremos el patrón Factory, para crear páginas, desde un solo lugar, aun que esta vez, el código del método CrearPagina es mucho más sencillo, que el del ejemplo que implementamos en Factory:
Noten el uso de un enum para usarlo como implementación del patrón estrategia, el que determina el tipo de objeto a crear en cada ocasión.
Al final nuestro código de pruebas en la consola, sería así:
Y el resultado se vería de esta forma:
El poder del código solo es completo, si tenemos el conocimiento de como usarlo.
No hay comentarios:
Publicar un comentario