para abrir losl archivos .fla es necesario Adoble Flash Professional CS4 o
superior
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 :
if(GUI == "clara"){
new BotonClaro();
if(GUI == "clara"){
new VentanaClara();
new VentanaOscura();
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).
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:
Cocina
Pizza
Cocinero
CocineroHawai
CocineroPicante
En una situacin como esta el patrn Builder nos puede ayudar. Veamos un
ejemplo de su estructura:
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.
Cdigo :
cocina.elegirCocinero(new CocineroHawai());
// Creamos la pizza
Cdigo :
package {
this.cocinero = cocinero;
}
public function nuevaPizza():Pizza {
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:
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.
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:
Cdigo :
circuloNuevo.color = circuloExistente.getColor();
circuloNuevo.radio = circuloExistente.getRadio();
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 :
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.
Cdigo :
Cdigo :
package {
// Constructor
if (!llamadaInterna){
if (instancia == null) {
// al constructor es interna
llamadaInterna = true;
llamadaInterna = false;
}
return instancia;
Cdigo :
Lo tengo que leer mas despacio... pero una primera lectura me ha aclarado un montn de cosas y
eso que no es fcil transmitir este tipo de conceptos y currarselos para que sean accesible.
Abstract Factory
Si necesitas tener distintas implementaciones de una factora para generar
distintas familias de clases, probablemente tu arquitectura sea demasiado
complicada. En serio, tener un AbstractMembershipProviderFactory que
sirve para abstraer las distintas implementaciones de factoras capaces de crear
distintas implementaciones de MembershipProvider es como para detenerse a
pensar si realmente te hacen falta tantos grados de indireccin.
Ojo, no hay que confundir este patrn con el patrn factory (sin el abstract),
donde tenemos un objeto (la factora) que es capaz de crear distintos de objetos o
incluso distintas configuraciones de un mismo objeto. Este patrn tiene muchos
ms usos y es rara la aplicacin medianamente compleja en la que no aparece
varias veces.
Builder
Un patrn al que me cost mucho tiempo verle la utilidad real, pero que ha
encontrado un hueco muy importante en mi estilo de programacin a la hora de
escribir tests.
Otro escenario en el que se utiliza bastante es al disear interfaces fluidos de esos
que estaban tan de moda hace 8 aos. Me gusta especialmente cuando se usa para
preparar la construccin de la configuracin que se usar luego en tiempo de
ejecucin, al estilo de lo que se hace con Fluent NHibernate o con el IAppBuilder
de OWIN.
Saliendo de esos dos escenarios, tests e interfaces fluidos, la verdad es que no lo
uso demasiado. Es raro que construya tantas veces un mismo tipo de objeto y con
tantas configuraciones diferentes como para que me compense montar un builder.
Factory Method
La definicin original de factory method nunca me ha acabado de convencer. De
hecho, la diferencia con template method es realmente stil (esto pasa con ms
patrones), ya que consiste en tener un mtodo abstracto o virtual en una clase
base para construir algo, y dejar que las clases derivadas decidan exactamente
qu y como implementar.
Aunque eso tiene sus usos, hay otra forma de ver el factory method que s utilizo
ms y me parece ms prctica: tener un mtodo esttico que construye objetos. A
diferencia de un factory, que es una clase entera dedicada a construir cosas, aqu
tenemos uno o ms mtodo estticos para construirlas, y estos mtodos residen
generalmente en la clase base de la jerarqua de clases que estamos construyendo.
Un ejemplo es SymmetricAlgorithm.Create o WebRequest.Create.
Lo utilizo bastante para poder simular constructores con nombre y que quede
ms claro lo que estoy creado. Por
ejemplo, Color.FromRGB y Color.FromHexString,
o Result.Success(value) y Result.Error(exception).
Utilidad hoy en da: 2 (el factory/template method original), 4 (el factory
method as named constructor).
Prototype
Si nos ceimos nicamente a clonar objetos, que es lo que dice el patrn original,
la cosa se queda un poco triste. Si ampliamos la idea a construir objetos a partir
de otros con las modificaciones que queramos, se hace ms interesante. Puede
parecer que no se usa mucho, y tal vez en C# sea as, pero hay otros lenguajes en
lo que resulta muy habitual.
Singleton
El pobre singleton. Creo que fue el primer patrn de diseo que conoc y entend
(al igual que mucha gente). De ah al abuso bueno, ya sabemos todos como
acab el singleton.
Pese a su mala fama, sigue teniendo su uso y, al igual que ocurre con los mtodos
estticos, se pueden salvar muchos de sus problemas. Aun as, su utilidad es
limitada y suelo preferir separar la gestin del ciclo de vida de la clase de la
propia clase, dejando que sea otro el que lo gestione.
En general, antes de utilizar un singleton prefiero utilizar una fachada esttica.
Pierdes la parte de la inicializacin perezosa, pero te ahorras algo de cdigo al no
tener que andar poniendo el Instance o getInstance() por todas partes.
Utilidad hoy en da: 2.
Conclusin
En este post hemos repasado los 5 patrones creacionales clsicos y, en conjunto,
podramos decir que gozan de una salud bastante razonable, y ms teniendo en
cuenta que vienen de una poca en la que no exista ni Java.
Builder y Prototype son dos patrones de uso ms limitado. Cuando son tiles,
resultan muy tiles, pero lo cierto es que no los utilizo con tanta frecuencia.
inShare32
Posts relacionados:
1. Patrones de Reutilizacin de Cdigo entre Componentes de ReactJS
2. Parece lo mismo pero
3. Diseo por Contrato