Propósito
Proporciona
una interfaz para crear familias de objetos o que dependen entre sí, sin
especificar sus clases concretas.
TAMBIÉN
CONOCIDO COMO
Kit.
MOTIVACIÓN
Pensemos
en un toolkit de interfaz de usuario que admita múltiples estándares de
interfaz de usuario, de la interfaz de usuario como las barras de
desplazamiento, ventanas y botones. Para que una aplicación pueda portarse a
varios estándares de interfaz de usuario en particular. Si la aplicación crea
instancias de clases o útiles específicos
de la interfaz de usuarios será difícil cambiar ésta más tarde.
Aspecto
estático
La
estructura típica del patrón Abstract Factory es la siguiente:
- Cliente: La clase que llamará a la factoría adecuada ya que necesita crear uno de los objetos que provee la factoría, es decir, Cliente lo que quiere es obtener una instancia de alguno de los productos (ProductoA, ProductoB).
- AbstractFactory: Es la definición de la interfaces de las factorías. Debe de proveer un método para la obtención de cada objeto que pueda crear. ("crearProductoA()" y "crearProductoB()")
- Factorías Concretas: Estas son las diferentes familias de productos. Provee de la instancia concreta de la que se encarga de crear. De esta forma podemos tener una factoría que cree los elementos gráficos para Windows y otra que los cree para Linux, pudiendo poner fácilmente (creando una nueva) otra que los cree para MacOS, por ejemplo.
- Producto abstracto: Definición de las interfaces para la familia de productos genéricos. En el diagrama son "ProductoA" y "ProductoB". En un ejemplo de interfaces gráficas podrían ser todos los elementos: Botón, Ventana, Cuadro de Texto, Combo... El cliente trabajará directamente sobre esta interfaz, que será implementada por los diferentes productos concretos.
- Producto concreto: Implementación de los diferentes productos. Podría ser por ejemplo "BotónWindows" y "BotónLinux". Como ambos implementan "Botón" el cliente no sabrá si está en Windows o Linux, puesto que trabajará directamente sobre la superclase o interfaz.
COLABORADORES
- Normalmente solo se crea una única instancia de una clase Fábrica concreta en tiempo de ejecución. Esta fábrica concreta crea objetos producto que tienen una determinada implementación.
- Para crear diferentes objetos producto, los clientes deben usar una fábrica concreta diferente.
- Fabrica Abstracta delega la creación de objetos en su sub clase Fabrica concreta.
CONSECUENCIAS
El
patrón adstract Factory tiene las siguientes ventajas e inconvenientes
- Aísla las clases concretas. El patrón ayuda a controlar las clases de objetos que crea una aplicación. Como una fábrica encapsula la responsabilidad y el proceso de creación de objetos producto, aísla a los clientes de las clases de implementación. Los clientes manipulan las instancias a través de sus interfaces abstractas. Los nombres de las clases producto quedan aisladas en el implementación de la fábrica concreta no aparecen en el código cliente.
- Facilita el intercambio de familias de productos. La clase de una fábrica concreta sólo aparece una vez en una aplicación-cuando se crea-.Esto facilita cambiar la fábrica concreta que usa una aplicación. Como una fábrica abstracta crea una familia completa de productos.
- Promueve la consistencia entre productos. Cuando se diseñan objetos producto en una familia a la vez.
- Es difícil dar cabida a nuevos tipos de productos. Ampliar las fábricas abstractas para producir nuevos tipos de productos no es fácil. Esto se debe a que la interfaz fija el conjunto de productos que se pueden crear. Permitir nuevos tipos de productos requiere ampliar la interfaz de la fábrica, lo que a su vez implica cambiar la clase y todas sus subclases. En la sección de implementación se analiza una solución a este problema.
No hay comentarios:
Publicar un comentario