Sunteți pe pagina 1din 20

PATRONES CREACIONALES

Los ptrones de diseo de rein proporionn yud l hor de


rer objetos desde el punto de vist de proporionr un poyo en l
tom de deisiones, inluso undo est tom de deisiones se de
form dinmi.

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:

liente: Entidad que llamar a la fbria adeuada que neesite


para rear uno de los objetos que provee diha fatora, es deir,
intentar obtener una instania de alguno de los produtos que
entren en juego (ProdutoA, ProdutoB).

AbstratFatory: Definiin de la interfaz que usarn las


diferentes fatoras. omo mnimo, debe ofreer un mtodo para
la obtenin de ada objeto que se pueda rear.
(rearProdutoA() y rearProdutoB())

onrete Fatories: Aqu se representarn las diferentes familias


de produtos. Provee la instania onreta del objeto que se
enarga de rear.

Abstrat Produt: Definir las interfaes para la familia de


produtos genrios. En el diagrama son ProdutoA y
ProdutoB. El liente trabajar diretamente sobre esta
interfaz, que ser implementada por los diferentes produtos
onretos.
onrete Produt: Se enargar de la implementain espefia
de los diferentes produtos.

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.

El patrn de diseo software de reain Fatory Method puede ser


usado uando:

La reain de un objeto impide su reutilizain sin una


importante dupliain de digo.

La reain de un objeto requiere aeso a la informain o


reursos que no deberan estar ontenidos en la lase de
omposiin.

La administrain de la durain de los objetos generados debe


ser entralizada para garantizar un omportamiento oherente en
la apliain.
Por tanto, los omponentes del patrn de reain Fatory Method
sera:

Produt: define una interfaz de un objeto que metodo Fatory


reara.

onreteProdut: implementa la interfaz Produt para rear un


produto en onreto.

reator: delara el metodo fatory que devolvera un objeto del


tipo produt.

onretereator: sobre esribe e metodo fatory del reator


devoler una intania de un produto en onreto
(onreteProdut).

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.

Eso s, la lgia y diseo que neesite el sistema para la ejeuin y


deisin de la reain de estos objetos opia, se hae de forma
independiente al patrn, siendo ste referido uando el fragmento de
digo pertinente soliite una opia del objeto que neesite. abe
destaar que haer una opia signifia rear otra instania del objeto
(siempre que este tenga la funionalidad de lonarse) on las
partiularidades neesarias en ese instante.

Destaar tambin, que el API de Java dispone de interfaz loneable que


failita la implementain de este patrn, haindola ompatible on
otros prototipos que se enuentran en las diferentes libreras de Java.

Los atores que intervienen en el patrn de reain Prototype, son:

liente: Ator soliitante de la reain (lonain) de los nuevos


objetos a partir de los prototipos.

Prototipo onreto: Ator (lase) que presenta unas


araterstias onretas que sern reproduidas en los nuevos
objetos y que presenta la implementain neesaria para lonarse.

Prototipo: Delara una interfaz, al a que aede el liente, que


sirve para la lonain de objetos.
Singleton
El patrn de diseo de software de reain Singleton (haiendo
referenia a una instania nia) busa restringir la reain de objetos
perteneientes a una lase o el valor de un tipo a un nio objeto. Su
intenin es garantizar que una lase slo sea instaniada una vez y,
adems, proporionar un nio punto de aeso global a la misma. Esto
lo onsigue graias a que es la propia lase la responsable de rear esa
nia instania, (delarando el onstrutor de la lase omo privado) y
a que se permite el aeso global a diha instania mediante un mtodo
de lase.

Ejemplos de situaiones habituales en las que onvendra apliar este


ejemplo de patrn de diseo son aquellas en las que la lase prinipal
busa ontrolar el aeso a un reurso nio (omo puede ser el ratn o
un arhivo abierto en modo exlusivo) o uando ierto tipo de datos
debe estar disponible para todos los dems objetos.

Los patrones creaciones abstraen el proceso de instanciacin y hacen que el sistema sea
independiente de la creacin de los objetos.

Dentro de los patrones creacionales se tiene:

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:

Imaginemos que estamos trabajando con Interfaces Grficas de Usuario (GUI).


Pensemos que, en nuestro programa, tenemos las clases Ventana y Boton.
Pongamos, por ejemplo, que tenemos 2 interfaces diferentes: una con colores claros y
otra con colores oscuros. Esto nos llevara a tener 4 clases:

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

var GUI:String = "clara"; // u "oscura";

// A la hora de crear un botn

if(GUI == "clara"){

new BotonClaro();

}else if(GUI == "oscura"){

new BotonOscuro();

// A la hora de crear una ventana

if(GUI == "clara"){

new VentanaClara();

}else if(GUI == "oscura"){

new VentanaOscura();

Esto implicara realizar una comprobacin de la interfaz seleccionada cada vez que se
quiera crear una Ventana o un Boton.

La mejor opcin en este caso sera utilizar el patrn Abstract Factory.

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.).

Una vez utilizado el patrn, el cdigo anterior quedara as:

Cdigo :

// A la hora de seleccionar la interfaz

var GUI:InterfazGrafica = new InterfazClara(); // o new


InterfazOscura();
// A la hora de crear un botn

GUI.crearBoton();

// A la hora de crear una ventana

GUI.crearVentana();

Segn el tipo de InterfazGrafica instanciada, se crearn ventanas/botones de un tipo


u otro dinmicamente, sin necesidad de comprobar a mano qu interfaz grfica se est
utilizando.

Descargar archivos de ejemplo Abstract Factory

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 :

var cocina:Cocina = new Cocina();

// Decidimos que se crearn pizzas hawaianas

cocina.elegirCocinero(new CocineroHawai());

// Creamos la pizza

var pizzaHawaiana:Pizza = cocina.nuevaPizza();

El cdigo de la clase Cocina podra ser algo as:

Cdigo :

package {

public class Cocina {

private var cocinero:Cocinero;

public function elegirCocinero(cocinero:Cocinero):void {

this.cocinero = cocinero;

public function nuevaPizza():Pizza {

cocinero.hacerMasa();
cocinero.utilizarSalsa();

cocinero.hacerRelleno();

Opcionalmente podra definirse un constructor para la clase Cocina que recibiese el


cocinero como argumento, ahorrando la llamada a elegirCocinero().

Descargar archivos de ejemplo Builder

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 :

// Seleccionaramos el tipo de pieza aleatoriamente

var tipo:uint = Math.random()*7; // 7 es el nmero de


piezas diferentes en el Tetris
// Creamos dicha pieza

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 :

// Seleccionaramos el tipo de pieza aleatoriamente

var tipo:uint = Math.random()*7; // 7 es el nmero de


piezas diferentes en el Tetris

// Creamos dicha pieza

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:

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.
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.

Una vez utilizado el patrn, el cdigo anterior quedara as:

Cdigo :

// Crearamos una lista con todas las fbricas


var creadores:Vector.<ICreador> = new Vector.<ICreador>();

creadores.push(new CreadorL(), new CreadorT(), new


CreadorI());

// Seleccionaramos el tipo de pieza aleatoriamente

var tipo:uint = Math.random()*7; // 7 es el nmero de


piezas diferentes en el Tetris

// Creamos dicha pieza

creadores[i].crearPieza();

De esta manera no necesitaramos un switch, sino que se creara la pieza a travs


del creador seleccionado.

Descargar archivos de ejemplo Factory Method

Prototype
El patrn Prototype o Prototipo resuelve el problema de duplicar objetos ya creados
con anterioridad. Veamos un pequeo ejemplo de este patrn:

Imaginemos que tenemos un programa de dibujo por ordenador en el cual podemos


crear crculos y cuadrados. Cuando se crea un crculo, ste tiene un radio de 50
pxeles y es de color rojo. Sin embargo, podemos redimensionar el crculo y cambiar
su color. Cuando se crea un cuadrado, tiene 50 pxeles de lado y es de color azul.
Hasta aqu todo perfecto.

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 :

var circuloNuevo:Circulo = new Circulo();

circuloNuevo.color = circuloExistente.getColor();
circuloNuevo.radio = circuloExistente.getRadio();

Uno de los problemas ms inmediatos de hacerlo de esta manera es que, si se


aaden nuevos atributos a la clase Circulo, habra que modificar el cdigo en cada
lugar donde se haya hecho una copia de un Circulo.

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.

Una vez utilizado el patrn, el cdigo anterior quedara as:

Cdigo :

var circuloNuevo:Circulo = circuloExistente.clonar();


Si ahora quisiramos aadir nuevos atributos a la clase Circulo, slo habra que
modificar el mtodo clonar():IPrototipo de la clase Circulo.

Por ltimo, debe saberse que hay 2 tipos de clonacin de


objetos: profunda y superficial. Imaginemos un objeto A que contenga una referencia a
un objeto B. Una clonacin profunda hara que la copia del objeto A referenciase a una
copia del objeto B. Por el contrario, una clonacin superficial hara que la copia del
objeto A apuntase al mismo objeto B que el objeto A original. Esto se entiende mejor
con este ejemplo grfico.

Descargar archivos de ejemplo Prototype

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.

Sin embargo, podramos desear que, si la ventana de ayuda ya ha sido abierta, no se


abra de nuevo. Para ello recurriramos a un patrn Singleton, que asegurara la
existencia de una nica ventana de ayuda en todo momento.

Veamos un ejemplo de la estructura del patrn Singleton:

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 :

var ayuda:VentanaAyuda = VentanaAyuda.getInstancia();

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 {

public class VentanaAyuda{

// Esta variable guardar la nica instancia de sta clase

// que existir en el programa

private static var instancia:VentanaAyuda;

// sta variable servir para saber cundo el constructor

// es invocado desde fuera de la clase

private static var llamadaInterna:Boolean;

// Constructor

public function VentanaAyuda(){


// Comprobamos si la llamada se ha producido

// desde fuera de esta clase

if (!llamadaInterna){

// Si se ha intentado instanciar la clase desde el

// exterior, la aplicacin devolver un error y no

// se crear ninguna instancia de VentanaAyuda.

throw new Error("Debes usar getInstancia()");

// Mtodo que instanciar la clase una sola vez

public static function getInstancia():VentanaAyuda {

// Comprobamos si la instancia no se ha creado todava

if (instancia == null) {

// Especificamos que la llamada

// al constructor es interna

llamadaInterna = true;
// Guardamos en la variable "instancia"

// una instancia de esta clase

instancia = new VentanaAyuda();

// Especificamos que las llamadas

// posteriores no sern internas

llamadaInterna = false;

// Por ltimo, devolvemos la instancia existente

return instancia;

S-ar putea să vă placă și