Documente Academic
Documente Profesional
Documente Cultură
Abstrat Fatory
El patrn Abstrat Fatory o Fbria Abstrata resuelve el problema de
rear familias de objetos. Permite trabajar on objetos de diferentes
familias de manera que no se mezlen entre s. El patrn Abstrat
Fatory, por tanto, se reomienda uando se determina la inlusin de
nuevas familias de produtos en un futuro, pero resultara
ontraproduente si que neesita aadir nuevos produtos o modifiar
los existentes, ya que tendra reperusin en todas las familias readas.
Segn esto, podemos deir que los omponentes tpios del patrn
Abstrat Fatory es la siguiente:
Fatory Method
Este patrn de diseo de reain onsiste en utilizar una lase
onstrutora abstrata (similar al onepto del patrn Abstrat Fatory)
on unos mtodos definidos y otro(s) abstrato(s): el(los) dediado(s) a
la onstruin de objetos de un subtipo determinado.
Prototype
El patrn de diseo de reain Prototype, sirve para rear un dupliado
de un objeto, lonando, para ello, una instania de ese objeto que ya
haya sido reada. Para ello, el patrn tiene que espeifiar el tipo de
objeto que quiere lonar, reando as un prototipo de esa instania.
Este tipo o lase de objetos deber ontener en su interfaz el
proedimiento que permita soliitar esa opia, siendo desarrollado
luego por las lases onretas del patrn que deseen rear ese lon.
Los patrones creaciones abstraen el proceso de instanciacin y hacen que el sistema sea
independiente de la creacin de los objetos.
Abstract Factory
Permite la creacin de familias de objetos relacionados que dependen entre si.
Motivacin: La motivacin para la creacin de este patro es a aceptacin de multiples
presentaciones de usuario, por ejemplo vamos a suponer que deseamos construir una
aplicacin en la que necesitemos tener diferentes look and feel entonces se lo puede
solocionar por medio de este patron.
Estructura:
Participantes:
Fabrica Abstracta: Declara una interfaz para operaciones que crean objetos de producto
abstracto
FabricaConcreta: Implementa las operaciones para crear objetos producto concreto
ProductoAbstracto: Declara una interfaz para un tipo de objeto producto
ProductoConcreto: Define un objeto producto para que sea creado por la fabrica
correspondiente
Cliente: Usa las interfaces de FabricaAbstracta y ProductoAbstracto
Abstract Factory
El patrn Abstract Factory o Fbrica Abstracta resuelve el problema de crear familias
de objetos. Veamos un ejemplo tpico de este patrn:
VentanaClara
VentanaOscura
BotonClaro
BotonOscuro
Cuando el usuario decida trabajar con colores claros, se deben crear instancias
de VentanaClara y BotonClaro. Sin embargo, si el usuario decide utilizar la interfaz
de colores oscuros, deberamos crear instancias de VentanaOscura y BotonOscuro.
La forma ms bsica de hacerlo sera de esta manera:
Cdigo :
// A la hora de seleccionar la interfaz
if(GUI == "clara"){
new BotonClaro();
new BotonOscuro();
if(GUI == "clara"){
new VentanaClara();
new VentanaOscura();
Esto implicara realizar una comprobacin de la interfaz seleccionada cada vez que se
quiera crear una Ventana o un Boton.
En este patrn se crean ciertas clases adicionales llamadas fbricas. Estas clases son
las encargadas de crear los diferentes tipos de ventanas y botones. Veamos un
ejemplo de su estructura:
Click en la imagen para ver en tamao original
Identifiquemos cada clase del diagrama con las clases de nuestro ejemplo:
Cliente: Parte del programa que utilizar las fbricas y productos. Podra ser el
archivo .fla principal, por ejemplo.
IProductoA: Interfaz que define un ejemplo de producto. Se correspondera con la
clase Ventana de nuestro ejemplo.
ProductoA1 y ProductoA2: Los diferentes tipos de ese producto. Se corresponderan
con la clases VentanaClara y VentanaOscura.
IProductoB: Interfaz que define otro ejemplo de producto. Se correspondera con la
clase Boton de nuestro ejemplo.
ProductoB1 y ProductoB2: Los diferentes tipos de ese producto. Se corresponderan
con la clases BotonClaro y BotonOscuro.
IFabrica: Interfaz que define las funciones de creacin de productos. En nuestro
ejemplo podra llamarse InterfazGrafica y definira las
funciones crearVentana():Ventana y crearBoton():Boton.
Fabrica1 y Fabrica2: Clases encargadas de crear los productos. En nuestro ejemplo,
seran InterfazClara (que creara instancias de VentanaClara y BotonClaro)
e InterfazOscura (que creara instancias de VentanaOscura y BotonOscuro).
Cabe sealar que podra haber ms tipos de productos (Ventana, Boton, Icono, etc.)
y ms familias de estos (InterfazClara, InterfazOscura, InterfazAzul, InterfazRoja,
etc.).
Cdigo :
GUI.crearBoton();
GUI.crearVentana();
Builder
El patrn Builder o Constructor se utiliza cuando queremos crear un producto que
tiene diferentes partes. El siguiente ejemplo, basado en este otro, lo ilustra mejor:
Imaginemos la cocina de una pizzera donde se hacen pizzas. Las pizzas constan de
varias partes (masa, salsa y relleno), y podramos tener 2 cocineros, cada uno
especialista en un tipo de pizza. Esto nos llevara a tener 5 clases:
Cocina
Pizza
Cocinero
CocineroHawai
CocineroPicante
En una situacin como esta el patrn Builder nos puede ayudar. Veamos un ejemplo
de su estructura:
Click en la imagen para ver en tamao original
Identifiquemos cada clase del diagrama con las clases de nuestro ejemplo:
Cliente: Parte del programa que utilizar el resto de clases. Podra ser el
archivo .fla principal, por ejemplo.
Director: Clase que decide qu constructor se utiliza y cuando se debe construir el
producto. Se correspondera con la clase Cocina de nuestro ejemplo.
IConstructor: Interfaz que define las funciones de creacin de cada parte del producto
y la funcin de obtencin del producto resultante. En nuestro ejemplo se
correspondera con Cocinero y definira las
funciones hacerMasa():void, utilizarSalsa():void y hacerRelleno():void.
Constructor1 y Constructor2: Clases encargadas de crear las partes del producto.
En nuestro ejemplo, seran CocineroHawai y CocineroPicante.
Producto: Clase del producto en s. Se correspondera con la clase Pizza de nuestro
ejemplo.
De esta manera, un posible cdigo de este ejemplo sera el siguiente:
Cdigo :
cocina.elegirCocinero(new CocineroHawai());
// Creamos la pizza
Cdigo :
package {
this.cocinero = cocinero;
cocinero.hacerMasa();
cocinero.utilizarSalsa();
cocinero.hacerRelleno();
Factory Method
El patrn Factory Method o Mtodo de Fbrica es una simplificacin del
patrn Abstract Factory. En un patrn Factory Method slo existe un producto, no
una familia de ellos. Veamos un ejemplo donde yo mismo he utilizado este patrn:
Imaginemos que deseamos crear un juego estilo Tetris. En este juego tendramos
diferentes tipos de piezas. Esto nos llevara a tener una clase por cada tipo de pieza:
PiezaL
PiezaT
PiezaI
...
Cada vez que se crea una pieza nueva, desearamos seleccionar el tipo de pieza de
forma aleatoria. La forma ms bsica de hacerlo sera la siguiente:
Cdigo :
switch(tipo){
case 1:
new PiezaL();
break;
case 2:
new PiezaT();
break;
case 3:
new PiezaI();
break;
// ...
Sin embargo, sera mucho ms sencillo poder hacerlo de una manera parecida a esta:
Cdigo :
new Pieza[tipo]();
Para poder hacer algo as debemos utilizar el patrn Factory Method.
En este patrn se utilizan fbricas, al igual que en el patrn Abstract Factory. Estas
fbricas son las encargadas de crear los diferentes tipos de piezas. Veamos un
ejemplo de su estructura:
Identifiquemos cada clase del diagrama con las clases de nuestro ejemplo:
Cliente: Parte del programa que utilizar las fbricas y productos. Podra ser el
archivo .fla principal, por ejemplo.
IProducto: Interfaz que define el producto. Se correspondera con una clase Pieza en
nuestro ejemplo.
ProductoA y ProductoB: Los diferentes tipos del producto. Se corresponderan con la
clases PiezaL, PiezaT y PiezaI.
IFabrica: Interfaz que define las funcin de creacin del producto. En nuestro ejemplo
podra llamarse ICreador y definira la funcin crearPieza():Pieza.
FabricaA y FabricaB: Clases encargadas de crear los productos. En nuestro ejemplo,
seran CreadorL (que creara instancias de PiezaI), CreadorT(que creara instancias
de PiezaT), CreadorI (que creara instancias de PiezaI), etc.
Cdigo :
creadores[i].crearPieza();
Prototype
El patrn Prototype o Prototipo resuelve el problema de duplicar objetos ya creados
con anterioridad. Veamos un pequeo ejemplo de este patrn:
Imaginemos ahora que el usuario decide crear un crculo y modifica su color y tamao.
Acto seguido, el usuario decide hacer una copia de dicho crculo. El cdigo sera el
siguiente:
Cdigo :
circuloNuevo.color = circuloExistente.getColor();
circuloNuevo.radio = circuloExistente.getRadio();
El patrn Prototype aade un mtodo que permita crear una copia de un objeto.
Veamos un ejemplo de su estructura:
Identifiquemos cada clase del diagrama con las clases de nuestro ejemplo:
Cliente: Parte del programa que utilizar las fbricas y productos. Podra ser el
archivo .fla principal, por ejemplo.
IPrototipo: Interfaz que define el mtodo clonar():IPrototipo. En nuestro ejemplo
podra ser una clase llamada IObjetoGrafico.
Prototipo1 y Prototipo2: Las diferentes clases que implementarn el mtodo de
clonacin. Se corresponderan con la clases Circulo y Cuadrado de nuestro ejemplo.
Cdigo :
Singleton
El patrn Singleton se utiliza para no permitir que existan mltiples instancias de una
clase, sino solamente una. Veamos un pequeo ejemplo de este patrn:
Imaginemos un programa que, al hacer click en un icono de ayuda, cree una ventana
nueva con los documentos de ayuda del programa. Normalmente, si el usuario hiciese
click en el botn nuevamente, se abrira una nueva ventana, y as sucesivamente.
Identifiquemos cada clase del diagrama con las clases de nuestro ejemplo:
Cliente: Parte del programa que utilizar las fbricas y productos. Podra ser el
archivo .fla principal, por ejemplo.
Singleton: Clase que se quiere instanciar una sola vez. Se corresponde con la
clase VentanaAyuda de nuestro ejemplo.
La forma de implementar el patrn Singleton en este ejemplo sera dotando a la clase
VentanaAyuda de un mtodo esttico getInstancia():VentanaAyuda que comprobase si
ya existe una instancia VentanaAyuda o si, por el contrario, se debe crear. De esta
manera, el cdigo para crear una nueva VentanaAyuda sera el siguiente:
Cdigo :
Sin embargo, debemos evitar que el usuario pueda crear instancias de VentanaAyuda
mediante el constructor new VentanaAyuda(). La forma idnea de hacerlo es
declarando el constructor como privado, de modo que no pueda ser llamado desde
fuera de la clase VentanaAyuda. El problema es que ActionScript, de momento, no
permite la declaracin de constructores privados. Podemos solucionarlo de la siguiente
manera:
Cdigo :
package {
// Constructor
if (!llamadaInterna){
if (instancia == null) {
// al constructor es interna
llamadaInterna = true;
// Guardamos en la variable "instancia"
llamadaInterna = false;
return instancia;