Abstract Factory

Warning: This post isn’t ready
I’m translating this:

Abstract Factory

Problema: A la hora de crear objetos, resulta que tienes que crear no solo uno, si no varios, y configurarlos para que estén relacionados representando todo un grupo de clases. No es solo llamar al constructor de uno, que ese llame a otro y listo. Y se espera que en un futuro se añadan nuevas fábricas y tipos de producto. Si no entiendes bien esto ultimo mira el ejemplo, al final de él se explica lo de añadir nuevos sin modificar lo viejo.

Solución: Una clase especializada en construirte el sistema de clases listo y configurado según como se requiera. Aparte de que al tener el código de creación aparte puedes hacerlo estático para invocar la fábrica desde cualquier parte del código para crearte objetos.

Fundamento:


Es la primera vez que lees Interface. ¿Que es un interface? Es una clase sin variables en la que todas las funciones son abstractas. Lo que las hace especiales es que una clase puede heredar de solo una clase, pero puede heredar de todas las interfaces que quieras. En este caso no se llama heredar, si no implementar. Aunque es lo mismo.

Ejemplo: Vamos a realizar para el ejemplo un gestor de textos. El usuario crea un programa para gestionar pizzas. (Esta basado en el ejemplo de Headfirst. Me parece mejor ejemplo que el clásico de fabricar coches en el que los productos son puertas, carrocerías y ventanas, y en la fabrica se cogen esos)

En este caso, tenemos un gestor de pizzas que se encarga de fabricar pizzas (Debería ser más complejo e incorporar una clase Pizza para la información, pero para el ejemplo de fabrica abstracta nos vale). Las funciones escribir de los ingredientes nos servirán para saber que ingredientes tiene. La fabrica de pizzas modernas crea pizzas modernas (con salsa barbacoa y masa gruesa) mientras que la clasica crea pizzas más tradicionales de masa fina y jamón.

Ventajas de este diseño en este problema: Que si queremos añadir nuevos tipos de masa o nuevos tipos de topping… no hace falta modificar lo que ya esta hecho, es solo añadir, y así se evitan posibles fallos en el futuro: Se crea la clase ToppingHawaiana por ejemplo, que implemente Topping, y si eso se hace una nueva fabrica.


El código queda tal que así:

Interfaz Masa:

 

MasaFina:

 

MasaGruesa:

 

Interfaz Topping

 

Procciuto

 

Barbacoa

 

FabricaPizzasAbstracta

 

FabricaPizzasClasica

 

FabricaPizzasModernas

 

Gestor Pizzas

 

Ejecutando este ejemplo el resultado debería darte:

Leave a Reply