Este documento describe el patrón de diseño Abstract Factory. El patrón proporciona una interfaz para crear familias de objetos relacionados sin especificar sus clases concretas. Los participantes incluyen AbstractFactory, ConcreteFactory, AbstractProduct y Product. El patrón permite configurar un sistema con diferentes familias de productos y aísla las clases concretas que se crean.
2. Propósito
Proporciona una interfaz para crear familias de objetos
relacionados o que dependen entre sí, sin especificar
sus clases concretas.
CREACIÓN DE OBJETOS
3. Motivación
Pensemos un toolkit que admite múltiples estándares de
interfaz de usuario y es programado en una interfaz en
particular, su portabilidad y su modificación se complica.
Solución:
Una clase abstracta que declara una interfaz para crear cada
tipo de básico de widget.
Una clase abstracta para cada tipo de widget.
Las subclases concretas implementan widgets para un estándar
concreto de interfaz de usuario.
Los usuarios llaman a esta clase abstracta sin ser conscientes
que clase concreta se está usando, de esta manera se consigue
una independencia entre cliente y interfaz de usuario.
5. Aplicabilidad
Un sistema debe ser independiente de cómo se crean,
componen y representan sus productos.
Un sistema debe ser configurado con una familia de
productos de entre varias.
Una familia de objetos producto relacionados está
diseñada para ser usada conjuntamente y es necesario
hacer cumplir esta restricción
Quiere proporcionar una biblioteca de clases de
productos y sólo quiere revelar sus interfaces no sus
implementaciones.
7. Participantes
AbstactFactory: declara una interfaz para operaciones
que crean objetos, productos abstractos.
ConcreteFactory: implementa las operaciones para
crear objetos, productos concretos.
AbstractProduct: declara una interfaz para un tipo de
objeto producto.
8. Participantes
Product: define un objeto producto para que sea creado
por la fábrica correspondiente. Implementa la interfaz
AbstractProduct.
Cliente: sólo usa interfaces declaradas por las clases
AbstractFactory y AbstractProduct.
9. Colaboraciones
Normalmente sólo se crea una única instancia de una
clase ConcreteFactory 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.
AbstractFactory delega la creación de objetos producto
en su subclase ConcreteFactory.
10. Consecuencias
Ventajas:
Aísla las clases concretas: ayuda a controlar los objetos
que se creen y encapsula la responsabilidad y el proceso
de creación de objetos producto.
Facilita el intercambio de familias de productos sin
mezclarse, permitiendo configurar un sistema con una
de entre varias familias de productos.
Fomenta la consistencia entre productos.
11. Consecuencias
Desventajas:
Es difícil dar cabida a nuevos tipos de productos, esto se
debe a que la interfaz AbstractFactory fija el conjunto de
productos que se pueden crear. Permitir nuevos tipos de
productos requiere ampliar la interfaz de la fábrica,
cambiar la clase AbstractFactory y todas sus subclases.
12. Implementación
Fábricas únicas: una instancia de una ConcreteFactory
por cada familia de productos, suele implementarse mejor
como un Singleton.
Creación de productos: el modo más común para crear
las subclases Product (producto concreto) es definiendo un
método de fabricación para cada producto(Factory
Method).
En caso de que sea posible tener muchas familias de
productos, la fábrica concreta puede implementarse
usando el patrón Prototype.
Definir fabricas extensibles: añadiendo un parámetro en
las operaciones de creación que indique el tipo de objeto a
crear: mas flexible y menos seguro.
13. Usos conocidos
Los WidgetKit y DialogKit usan abstract factory para
el manejo de interfaz de usuario.
ET++ usa el patrón Abstract Factory para lograr
portabilidad entre varios sistemas de ventanas(por
ejemplo, X Windows y Sun View).