Title: Patrones de Diseo
 1Patrones de Diseño
- Daniel Mazzini 
 - dmazzini_at_ubicasolutions.com 
 - Ubica Solutions
 
  2Conocimientos previos
- Conocimientos de POO. 
 - UML (básico) 
 - C
 
  3Agenda
- Propósito de los patrones 
 - Fundamentos de diseño.
 
- Creación. 
 - Factory Method 
 - Singleton 
 - Abstract Factory
 
- Estructurales 
 - Adapter 
 - Facade 
 - Composite
 
- Comportamiento 
 - Command 
 - State 
 - Observer
 
  4Propósito de los patrones
- Qué es un patrón de diseño? 
 - Por qué usarlos? 
 - Categorización 
 - Problema - Patrón
 
  5Qué es un patrón de diseño?
- Ante un problema reiterado ofrece una solución 
contrastada que lo resuelve.  - Describe el problema en forma sencilla. 
 - Describe el contexto en que ocurre. 
 - Describe los pasos a seguir. 
 - Describe los puntos fuertes y débiles de la 
solución.  - Describe otros patrones asociados.
 
  6Por qué usarlos?
- Mejora en la comunicación y documentación 
 - Hay que hacer un Factory Method 
 - Facilita la documentación interna del proyecto. 
 -  Mejora la ingeniería de software. 
 - Eleva el nivel del grupo de desarrollo. 
 - Previene reinventar la rueda en diseño 
 - Son soluciones ya probadas. 
 - Mejora la calidad y estructura 
 - Cuan grande debe ser una clase?
 
  7Categorización
- Fundamentales 
 - Se usan en otros patrones mas grandes 
 - Creación 
 - Aislar el proceso de creación de un objeto. 
 - Estructura 
 - Desacopla el sistema. 
 - Comportamiento 
 - Describe situaciones de control de flujo.
 
  8Problema - Patrón
- Crear un objeto sin especificar la clase a la que 
pertenece  - Abstract Factory 
 - Factory Method 
 - Prototype 
 - Dependencia para tareas especificas 
 - Command 
 - Cadena de Responsabilidad
 
  9Problema  Patrón (cont)
- Dependencia hacia el hardware o software 
 - Abstract Factory 
 - Bridge 
 - Dependencia hacia los algoritmos 
 - Strategy 
 - Template Method 
 - Builder
 
  10Problema  Patrón (cont)
- Alto acoplamiento 
 - Façade 
 - Mediator 
 - Observer 
 - Imposibilidad de cambiar la clases 
convenientemente  - Adapter 
 - Decorator 
 - Visitor
 
  11Fundamentos de diseño
- Programar para las interfaz, no para la herencia. 
 - Favorecer la composición antes que la herencia. 
 - Delegación. 
 - Doble Herencia.
 
  12Herencia o interfaz
- La herencia de clase define la implementación de 
una clase a partir de otra (excepto métodos 
abstractos)  - La herencia de interfaz define como se llamara el 
método o propiedad, pudiendo escribir distinto 
código en cada clase. 
  13Programar para las interfaz
- Reutilizar la implementación de la clase base es 
la mitad de la historia.  - Ventajas 
 - Reducción de dependencias. 
 - El cliente desconoce la implementación. 
 - La vinculación se realiza en tiempo de ejecución. 
 - Da consistencia (contrato). 
 - Desventaja 
 - Indireccionamiento.
 
  14Favorecer la composición
- Ventajas de la herencia 
 - Implementación ya realizada. 
 - Útil en situaciones es un 
 - Desventajas de usar herencia 
 - Construir un monstruo. 
 - No se puede cambiar la implementación heredada en 
tiempo de ejecución.  - Quebrar la encapsulación. 
 -  Visibilidad. 
 
  15Favorecer la composición (cont)
- Ventajas de la composición 
 - Crear una nueva clase ensamblando con mas de una 
clase.  - Puede cambiar la clase con la cual ensamblo en 
tiempo de ejecución.  - Centrar cada clase en una tarea. 
 - Desventaja de la composición 
 - Requiere escribir un poco mas de código. 
 - Indireccionamiento.
 
  16Delegación
- Una forma de componer. 
 - Se delega un conjunto de operaciones de un objeto 
en otro objeto.  - La herencia que use en VB6.
 
return Delegado.operacion() 
 17Anti-Ejemplo
Nuevo requerimiento No todos las ventanas son 
cuadradas 
 18Ejemplo de Delegado
- Quito la herencia en ventana
 
- Creo una interfaz para comunicar el delegador con 
el delegado  
- Creo un método llamado Area en Ventana (solo para 
mantener compatibilidad) 
- Llamo al método de la interfaz que me da el área
 
  19DEMO
Delegado 
 20Delegado en .Net 
 21Doble Herencia
- Problema 
 - Mantener las clases que implementan como internas 
del proyecto (internal o Friend), pero la 
interfaz pública.  - Organizar clases que tienen un comportamiento 
parecido para que sea consistente. 
  22Doble Herencia (cont)
- Clase base es abstracta. 
 - La clase base puede heredar de mas de una 
interfaz.  - Una vez que están escritos los métodos, verifico 
si hay duplicación en las clases hijas. 
  23Doble Herencia en .NET 
 24Patrones de creación
- Propósito 
 - Crear un objeto es una toma de decisión. 
 - Separar los procesos de creación de objeto y de 
uso de un objeto.  - Cuales veremos? 
 - Factory Method 
 - Singleton 
 - Abstract Factory
 
  25Factory Method
- Problema 
 - La instancia del objeto a crear depende de 
condiciones externas a la clase cliente.  - Puede cambiar independientemente de cambiar la 
clase cliente.  - Ya he creado la estructura con Doble Herencia, 
pero ahora necesito poder crear una instancia de 
cualquier clase concreta. 
  26Factory Method 
 27DEMO
Factory Method 
 28F.M. con Constructor Estático
- Método estático en clase abstracta que retorno 
instancias.  -  Constructores privados o protegidos.
 
  29DEMO
Static Factory 
 30Singleton
- Problema 
 - No se puede tener mas de una instancia de una 
clase.  - Se necesita controlar el acceso a una clase.
 
  31Singleton
- Cambio el constructor a privado. 
 - Hago que la clase no pueda ser heredada. 
 - Agrego una variable estática del mismo tipo de la 
clase donde esta contenida. (instancia)  - Agrego un método estático que retorne la variable 
estática. (GetInstance)  - No creo el objeto hasta que sea necesario (Lazy 
Creation)  - Agrego el código necesario para no crear dos 
instancias en distintos thread. 
  32DEMO
Singleton 
 33Abstract Factory
- Problema 
 - Necesito crear una familia de objetos. 
 - Trabajo con mas de una familia. 
 - No puedo combinar ítems de las familias de 
objetos.  - El resto del sistema debe trabaja sin distinguir 
entre familias de objetos.  
  34Abstract Factory 
 35Ruedas CrearRueda()  return new Rueda26() 
Ruedas CrearRueda()  return new 
RuedaMoto() 
Ruedas CrearRueda()  return new RuedaF1()  
 36DEMO
Abstract Factory 
 37Patrones de estructura
- Propósito 
 - Desacoplar el sistema. 
 - Obtener una estructura flexible. 
 - Organizar. 
 - Cuales veremos? 
 - Adapter 
 - Facade 
 - Composite
 
  38Facade
- Problemas 
 - El cliente hace muchos viajes al servidor. 
 - Separe por capas, pero tengo muchas clases 
públicas en el servidor para que puedan ser 
creadas desde el cliente.  - Necesito estructurar las llamadas desde el 
cliente. 
  39Facade
Form Cliente
 Cliente
Form Pedidos
Form Ctas Corrientes
Presentación
Lógica 
 40Facade 
 41Facade
- Caso de Uso  Facade 
 - Un caso de uso es lo interacción de un actor con 
el sistema. La métodos de la fachada encapsulan 
los pasos necesarios para llevar a cabo lo que el 
cliente desea hacer. 
  42DEMO
Facade 
 43Adapter
- Problemas 
 - Necesitamos llamar a un método a través de una 
interfaz para no tener dependencia en el cliente.  - La librería a la que hay que llamar no es nuestra 
y no implementa esa interfaz.  - No contamos con el código fuente de la librería.
 
  44Adapter
Cliente
IOperacion
Operacion() 
 45DEMO
Adapter 
 46Composite
- Problema 
 - Estructuras de árbol o estructuras 1-N. 
 - Tiene un objeto complejo que hay que descomponer 
en partes.  - Nodos especiales que pueden contener otros nodos. 
 
  47Composite
Espec Rojos  new ColorEsp(Color.Red) ArrayList 
prodRojos alm.Seleccionar(Rojos)
Espec RojoPeq  new CompuestoAndEsp( new 
ColorEsp(Color.Red), new TamañoEsp(Tamaño.Pequeño
)) ArrayList prodRojos alm.Seleccionar(RojoPeq)
Espec Peq  new TamañoEsp(Tamaño.Pequeño) ArrayLi
st prodPeq  alm.Seleccionar(Peq)
Especificación
EstaOK(Producto)bool
return (_espec1.EstaOK(Producto)  
_espec2.EstaOK(Producto)) 
 48Composite
Espec ar  new Espec  new 
ColorEsp(Color.Red), new 
TamañoEsp(Tamaño.Pequeño) Espec ExpresionOr  
new CompOrEsp(ar) ArrayList prodRojos 
alm.Seleccionar(ExpresionOr)
Lista
ColorEsp
TamañoEsp 
 49DEMO
Composite 
 50Composite Dinámico
Empleado
Agregar(Empleado) Quitar(Empleado) ObtenerSueld
os()double
NodosHojas
NodosPadre
Agregar(Empleado) Quitar(Empleado) ObtenerSueld
os()double
Agregar(Empleado) Quitar(Empleado) ObtenerSueld
os()double
Empleados 
 51DEMO
Composite Dinámico 
 52Patrones de Comportamiento
- Propósito 
 - Asignación de responsabilidad  Distribuir el 
comportamiento.  - Comunicación entre instancias. 
 - Se usa mas la composición que la herencia. 
 - Cuales veremos? 
 - Command 
 - Strategy 
 - State
 
  53Command
- Problema 
 - Operaciones repetidas (por ejemplo, en el menú y 
en el toolbar).  - Necesita controlar la secuencia de las 
operaciones.  - Necesito hacer un log de las operaciones que 
ejecuta el cliente. 
  54Command 
 55Command
- Tambien puedo 
 - Crear un método Deshacer en la Interfaz. 
 - Puedo crear una pila de los últimos comandos que 
se ejecutaran.  - Puedo sacar de la pila de comandos ejecutados y 
llamar al método Deshacer.  - Juntándolo con el patrón Composite puedo generar 
un comando Macro. 
  56Command
Command Manager
Undo(int Cantidad) Redo(int Cantidad) CrearComa
ndo(estado)
lista 
 57DEMO
Command 
 58State
- Problema 
 - Mantener el estado de un objeto. 
 - La organización de la lógica que maneja el estado 
(maquina de estado) se torna incontrolable.  - Acoplamiento entre la funcionalidad propia de la 
clase y la funcionalidad para manejar el estado 
de un objeto. 
  59State 
 60Observer
- Problema 
 - Mantener distintos objetos relacionados, 
generalmente son relaciones 1  N.  - Mantener las dependencias entre objetos, sin 
necesidad de conocer al otro objeto.  - Tipos de objetos 
 - Publicador  Aquel que tiene que notificar de un 
cambio.  - Suscriptores Aquellos interesados en recibir la 
notificación. 
  61Observer
Publicador
Agregar(Observador) Quitar(Observador) Notifica
r()
foreach Observador item in al  Item.Actualizar()  
 62Otras consideraciones
- Puedo enviar la información necesaria a los 
suscriptores al notificar o que pida lo que 
necesita (dependencia hacia el publicador)  - Ante casos de muchos publicadores, puedo hacer un 
Gestor de Cambios que haga la función de 
mediador.  - Al notificar se puede usar delegados y pasar 
clases que hereden de EventArgs al Suscriptor. 
  63DEMO
Observer y State 
 64Conclusiones
- Empiece por un patron, estudie los problemas que 
resuelve y pase cuando lo haya probado.  - Si la espada ya esta sobre su cabeza, lea los 
problemas que resuelven todos los patrones.  - No deje de leer 
 - Patrones de Diseño, E. Gamma y otros (GoF). 
 - Patterns of Enterprise Application Architecture, 
Martin Fowler