Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DesignPatternEs 001 PDF
DesignPatternEs 001 PDF
Descripción
Presenta una interfaz para la creación de familias de productos, de forma tal que el
cliente que las utiliza no requiera conocer las clases concretas que la componen. Esto
fuerza al cliente a crear solamente productos “relacionados” entre si, a la vez que lo
habilita para la utilización de distintas familias de productos.
Ejemplo
Grabador CD Reproductor
Fig. x.1
Si estos productos ofrecieran a sus usuarios la misma interfaz, un cliente podría reali-
zar el mismo proceso de prueba de productos en cualquiera de las familias. Por ejem-
plo, podría registrar una canción utilizando el dispositivo de grabación, para luego es-
cucharlo en el dispositivo de reproducción. Sólo deberíamos asegurarnos que los pro-
ductos sean compatibles entre si, esto es, que todos ellos pertenezcan a una misma
familia.
El patrón de diseño Abstract Factory resuelve este problema por medio de la encapsu-
lación de reglas de instanciación. Ésta permite ocultar en una clase “fábrica” el proce-
so de instanciación de un conjunto de productos. Por su parte, la encapsulación de los
productos tras interfaces comunes permitirá al cliente utilizar productos análogos per-
tenecientes a familias diferentes.
<<stereotipe>>
Client
<<stereotipe>> <<stereotipe>>
AbstractFactory AbstractProduct
{abstract} {abstract}
<<stereotipe>>
<<stereotipe>> <<instantiates>> ConcreteProduct
ConcreteFactory produces
#ConcreteProduct()
+createProduct() : AbstractProduct
Fig. x.2
Franco Guidi Polanco 3
Esquema
<<Interface>>
DevicesFactory
Client
+ createPlayer() : Player
+ createRecorder() : Recorder
+ createMedia() : Media
<<Interface>>
Media
Tape CD
<<Interface>>
Recorder
+ accept(Media)
+ record()
<<Interface>>
Player
+ ac cept(Media)
+ play()
Fig. x.3
Participantes
AbstractFactory (Fábrica Abstracta): interfaz DevicesFactory.
- Declara una interfaz para las operaciones que crean y restituyen productos.
- En la declaración de cada método, los productos restituidos son del tipo
AbstractProduct.
ConcreteFactory (Fábrica concreta): classes TapeDevicesFactory y
CDDevicesFactory.
- Cada una de estas clases Implementa la interfaz de la AbstractFactory (De-
vicesFactory), especificando las operaciones que crean y retornan ob-
jetos correspondientes a productos específicos (ConcreteProduct).
AbstractProduct: interfaces Media, Recorder y Player.
- Declaran las operaciones que caracterizan a los distintos tipos genéricos de
productos.
ConcreteProduct: clases Tape, TapeRecorder, TapePlayer, CD, CDRecorder y
CDPlayer.
- Definen los productos creados por cada ConcreteFactory.
Franco Guidi Polanco 4
En primer lugar, se definen las interfaces de las clases que deberán implementar los
productos análogos pertenecientes a las distintas familias. En el caso de este ejemplo,
Media es la interfaz que implementan los soportes de grabación. Particularmente esta
interfaz no especifica métodos, sólo actúa como una interfaz para “marcar” su rol. Por
su parte, las interfaces Player y Recorder definen las interfaces de reproductores y
grabadores, especificando los distintos métodos con los cuales el cliente interactuará
con ellas.
public interface Media { }
Los productos de las distintas familias implementan las interfaces definidas anterior-
mente. En el caso de la familia de productos basada en el casete, los productos son
Tape, TapeRecorder y TapePlayer:
Tape tapeInside;
}
Franco Guidi Polanco 5
Tape tapeInside;
CD cDInside;
CD cDInside;
La interfaz DevicesFactory declara los métodos que utilizará el cliente para interac-
tuar con las fabricas de productos. Nótese que cada método tiene la función de crear
un tipo de producto específico:
public interface DevicesFactory {
Franco Guidi Polanco 6
DevicesFactory technology;
player.accept( media );
player.play();
}
En este ejemplo se ha querido destacar la necesidad de que el cliente deba crear sólo
productos de una misma familia. En particular se debe notar que los métodos que
ofrece la clase CD y la clase Tape, y que son utilizados por los respectivos grabadores
y reproductores, son distintos. Este hecho, resulta irrelevante al momento de crear los
productos, pues la consistencia de la creación de objetos es garantizada por la clase
fábrica.
**Testing CD devices
Recording the song : Fly me to the moon...
Listening the record:
Fly me to the moon...
Debido a que, tanto la AbstractFactory, como los AbstractProduct de este ejemplo no im-
plementan operaciones, en Java resulta más adecuado codificarlos como interfaces,
en vez de clases abstractas, como se sugiere en [Gamma].
Otros ejemplos
Una compañía que produce videojuegos está interesada en crear un juego en el cual
el usuario debe escoger un personaje que lo representará a lo largo de una aventura,
junto con ciertas herramientas que éste puede utilizar. Las herramientas dependen del
personaje elegido, sin embargo, el código que regula la operación es idéntico para
cualquier personaje.