8 Patrones de Diseño - Creacion.pdf

Post on 07-Feb-2016

31 views 1 download

Transcript of 8 Patrones de Diseño - Creacion.pdf

Ingeniería de Sistemas

• Introducción. • Patrones. • Descripción de los Patrones. • Ejemplo: Patrones en el MVC de Smalltalk. • El catálogo de patrones.

• Patrones de Creación. • Patrones Estructurales. • Patrones de Comportamiento.

“Una arquitectura orientada a objetos bien estructurada está llena de patrones. La calidad de un sistema orientado a objetos se mide por la atención que los diseñadores han prestado a las colaboraciones entre sus objetos.”

“Los patrones conducen a arquitecturas más pequeñas, más simples y más comprensibles”

G. Booch

4

“Diseñar software orientado a objetos es difícil pero diseñar software orientado a objetos reutilizable es más difícil todavía. Diseños generales y flexibles son muy difíciles de encontrar la primera vez”

¿Qué conoce un programador experto que

desconoce uno inexperto?

Reutilizar soluciones que funcionaron en el pasado: Aprovechar la experiencia

Hardware Software

Poder reusar componentes y lograr un mantenimiento fácil. Lograr un software flexible

habitualmente

Problema Solución

Patrones de diseño

Un esquema que se usa para solucionar un problema.

El esquema ha sido probado extensivamente, y ha funcionado. Se tiene experiencia sobre su uso.

Elementos principales: ◦ Nombre ◦ Problema ◦ Solución: Descripción abstracta ◦ Consecuencias

Reutilizar diseños abstractos que no incluyan detalles de la implementación.

Un patrón es una descripción del problema y la esencia de su solución, que se puede reutilizar en casos distintos.

Es una solución adecuada a un problema común.

Asociado a orientación a objetos, pero el principio general es aplicable a todos los enfoques de diseño software.

Nombre del patrón. ◦ Describe el problema de diseño, junto con sus soluciones y

consecuencias. ◦ Vocabulario de diseño.

Problema. ◦ Describe cuándo aplicar el patrón. ◦ Explica el problema y su contexto.

Solución. ◦ Elementos que forman el diseño, relaciones, responsabilidades. ◦ No un diseño concreto, sino una plantilla que puede aplicarse en

muchas situaciones distintas. Consecuencias. ◦ Resultados, ventajas e inconvenientes de aplicar el patrón. ◦ ej.: relación entre eficiencia en espacio y tiempo; cuestiones de

implementación etc.

Separar los objetos con los datos ( modelo), sus visualizaciones (vistas) y el modo en que la interfaz reacciona ante la entrada al usuario (controlador).

Separar estos componentes, para aumentar la flexibilidad y reutilización.

Desacoplar vistas de modelos, mediante un protocolo de subscripción/notificación.

Cada vez que cambian los datos del modelo, avisar a las vistas que dependen de él. Estas se actualizan.

Asignación de Responsabilidades – Larman GRASP

Creación – Gamma y Grand Fcatory Method, Abstract Factory, Builder, Prototype, Singleton, etc.

Estructurales – Gamma y Grand Adapter, Iterator, Bridge, facade, Flyweight, Virtual Proxy, etc.

Arquitecturales – Bushman Distribuidos, Interactivos, adaptables, etc

Larman 10 patrones Gamma 23 patrones Bushman 17 patrones Grand 41 patrones

PATRONES

GOF

GRASP

Experto

Creador

Bajo acoplamiento

Alta Cohesión

Controlador

Creacionales

Estructurales

Comportamiento

Instancia única, método de fabricación ,

Fabrica, constructor, prototipo .

Adaptador, puente, objeto Compuesto, envoltorio, fachada,

Peso ligero, proxy

Cadena responsabilidad, orden, Intérprete, iterador, mediador, recuerdo,

Observador, estado, estrategia, método plantilla, visitante

Son para la asignación de responsabilidades, "General Responsibility Assignment Software Patterns". Son una serie de "buenas prácticas" de aplicación recomendable en el diseño de software. Patrones GRASP:

Experto, Creador, Bajo Acoplamiento, Alta Cohesión, Controlador

En que consiste la responsabilidad? Obligaciones o contratos de una clase

Dos clases de responsabilidades

Conocer: información del objeto Hacer: acciones con otros objetos

Es la abreviación del grupo Gang of Four, compuesto por Erich Gamma, Richard Helm, Ralph Jhonson y John Vlisides, quienes en su publicación “Design Patterns” describen 23 patrones de diseño comúnmente utilizados y de gran aplicabilidad en problemas de diseño usando modelamiento UML.

Documentar la experiencia en el diseño, en forma de un catálogo de patrones.

Categorías de patrones: ◦ De creación: implica el proceso de instanciar

objetos. ◦ Estructurales: composición de objetos. ◦ De comportamiento: cómo se comunican los

objetos, cooperan y distribuyen las responsabilidades para lograr sus objetivos.

Los patrones UML son colaboraciones parametrizadas, esto es, son un grupo de clases/objetos colaborando entre sí que se pueden abstraer de un conjunto de escenarios general. Antes de comenzar a usar un patrón primero debe ser creado como un diagrama estándar de UML o existir como tal en algún repositorio

Permite a una clase usar datos y servicios provistos por otras clases independientes proveyendo un acceso uniforme.

1. Instancia única (Singleton) : Asegure que una clase sólo tiene una instancia , y proporcionarle un punto global de acceso a dicha instancia

2. Método fabricación(Factory Method) : Define un interfaz para crear un objeto, pero dejar a subclases decidir sus instancias . El Método De la fábrica deja a una clase la creación de ejemplares o copias a subclases.

3. Fabrica abstracta (Abstract Factory) : Proporciona un interfaz para crear las familias de objetos relacionados o dependientes sin especificar sus clases concretas.

4. Constructor (Builder): Separa la construcción de un objeto complejo de su representación , de modo que el mismo proceso de construcción pueda crear representaciones diferentes.

5. Prototipo(Prototype) : Crea nuevos objetos creándolos de una instancia ya existente.

6. Adaptador (adapter) :Convierte la interfaz de una clase en otra interfaz que otra clase puede usar . debido a que la interfaces es incompatibles con dicha clase

7. Puente ( bridge) :Desacopla una abstracción de su implementación de modo que los dos puedan variar por separado.

8. Peso ligero (Flyweight ) :Reduce la redundancia cuando gran cantidad de objetos poseen idéntica información.

9. Fachada (Facade) : Proporciona un interfaz unificada a un juego de interfaces en un subsistema. La fachada define un interfaz de nivel más alto que hace el subsistema fácil de usar.

10. Envoltorio (Decorator) :Adjunta responsabilidades adicionales a un objeto dinámicamente. Los decoradores proporcionan una alternativa flexible a la subclasificación para ampliar la funcionalidad.

11. Objeto compuesto (Composite) :El objeto compuesto permite tratar a jerarquías de objetos en individuales y composiciones de objetos uniformemente como si se tratase de objetos simples

12. Proxy : Mantiene un representante de un objeto

13. Cadena responsabilidad (Chain of Responsibility ): Encadena los objetos de encubrimiento y pasa la petición a lo largo de la cadena hasta que un objeto la maneja. Permite establecer la línea que deben llevar los mensajes para que los objetos realicen la tarea indicada.

14. Orden (Command) : Encapsula una operación en un objeto, permitiendo ejecutar dicha operación sin necesidad de conocer el contenido de la misma.

15. Intérprete (Interpreter) :Considerando un lenguaje , define un representación para su gramática con un intérprete que usa la representación para interpretar sentencias en el mismo lenguaje.

16. Iterador (Iterator) :Proporciona un modo de tener acceso a los elementos de un objeto agregado secuencialmente sin exponer su representación subyacente.

17. Mediador (Mediator) :Define un objeto que coordine la comunicación entre objetos de distintas clases, pero que funcionan como un conjunto.

18. Recuerdo (Memento) : Sin violar encapsulación, captura y externaliza el estado interno de un objeto de modo que el objeto pueda ser restaurado a este estado más tarde.

19. Observador (Observer) : Define de uno a varios la dependencia entre objetos de modo que cuando se produce un cambio de estado del objeto, todos sus dependientes sean notificados y puestos al día automáticamente.

20. Estado (State) :Permite que un objeto modifique su comportamiento cada vez que cambie su estado interno

21. estrategia (Strategy) : Define una familia de algoritmos (métodos), encapsula cada uno, y los hace permutables. La estrategia deja al algoritmo (método) variar por separado de los clientes (objetos) que lo usan o invocan .

22. método plantilla ( template method) :Define el esqueleto de un algoritmo en una operación, aplazando algunos pasos a subclases. El Método de Plantilla deja a subclases redefinir los ciertos pasos de un algoritmo sin cambiar la estructura del algoritmo.

23. Visitante (Visitor) :Permite definir nuevas operaciones sobre una jerarquía de clases sin modificar las clases sobre las que opera.

Singleton Factory Method

Abstract Factory Builder

Prototype

Abstraen el proceso de creación de instancias.

Ayudan a hacer a un sistema independiente de cómo se crean, se componen y se representan sus objetos.

Un patrón de creación de clases usa la herencia para cambiar la clase de la instancia crear.

Un patrón de creación de objetos delega la creación de la instancia en otro objeto.

Objetivo: ◦ Garantiza que una clase sólo tenga una instancia, y

proporciona un punto de acceso global a ella Nombres: ◦ Único

Ejemplo: ◦ Una única cola de impresión para múltiples

impresoras

Cuando deba haber una única instancia de una clase

Acceso controlado a la única instancia Espacio de nombre reducido Más flexible que las operaciones de clase

Objetivo: ◦ Define una interfaz para crear un objeto, pero deja

que sean las subclases quienes decidan qué clase instanciar

Nombres: ◦ Virtual Constructor, Método de Fabricación

Ejemplo: ◦ Conexiones múltiples

Una clase no puede prever la clase de objetos que debe crear

Una clase quiere que sean sus subclases quienes especifiquen los objetos que ésta crea

Las clases delegan la responsabilidad en una de entre varias clases auxiliares

Creador

MetodoDeFabricacion() UnaOperacion()

ProductoConcretoA CreadorConcreto

MetodoDeFabricacion()

<<creates>>

... producto = MetodoDeFabricacion() ...

return new ProductoConcreto

<<Abstract>> Producto

ProductoConcretoB

Contabilidad

MetodoDeFabricacion() UnaOperacion()

SqlConexion Fabrica

creaConexion()

<<creates>>

... miConexion= miFab.creaConexion() ...

return new OracleConexion

<<Abstract>> Conexion

OracleConexion

Conexion conx = new OracleConexion() Conexion conx = new SQLConexion() Conexion conx = new MySqlConexion() Conexion conx = new PostgreSqlConexion()

Fabrica

Oracle Sql

Server

MySql PostgreSql

Conexion

OracleConexion

<<Abstract>> Conexion

SqlConexion

Fabrica

creaConexion()

<<creates>>

OracleConexion

Objetivo: ◦ Proporciona una Interfaz para crear familias de objetos

relacionados sin especificar clases concretas Nombres: ◦ Kit, Fábrica Abstracta

Ejemplo: ◦ Toolkit de interfaces de usuario en Windows, Linux, Mac

IFabricaAbstracta

CrearProductoA() CrearProductoB()

<<Interface>>

Cliente

FabricaConcreta1

CrearProductoA() CrearProductoB()

IProductoA

FabricaConcreta2

CrearProductoA() CrearProductoB()

ProductoA1 ProductoA2

IProductoB

ProductoB1 ProductoB2

<<creates>>

<<creates>>

<<creates>>

FabricaAbstracta

creaConexion() : Conexion

<<Interface>>

Pagos

Conexion

FabricaHeredada

CrearConexion()

SqlConexion OracleConexion <<creates>>

FabricaAbstracta

creaConexion() : Conexion

<<Interface>>

FabricaHeredada

CrearConexion()

Conexion

SqlConexion OracleConexion

Objetivo: ◦ Permitir que el código cliente controle el proceso de

construcción de los objetos. ◦ Separar la construcción de un objeto de su

representación, de manera que el mismo procesos de construcción pueda crear diferentes representaciones

Nombres: ◦ Constructor

Ejemplo: ◦ Robot constructor de hamburguesas

El algoritmo para crear un objeto complejo debiera ser independiente de las partes de que se compone dicho objeto y de cómo se ensamblan

El proceso de construcción debe permitir diferentes representaciones del objeto que está siendo construido

Permite variar la representación interna de un producto

Aísla el código de construcción y representación

Proporciona un control más fino sobre el proceso de construcción

Producto ConstructorConcreto

ConstruirParte() ObtenerResultado()

Cliente (from Logical View)

Director

Construir()

-constructor

<<creates>>

para todos los objetos { constructor->ConstruirParte() }

Constructor

ConstruirParte()

RobotHamburguesa

trabajar() cargaAcciones()

Cliente (from Logical View)

Builder

Construir()

-constructor

<<creates>>

para todos los objetos { robot->cargaAcciones () }

<<interface>> Robot

trabajar() cargaAcciones()

RobotHotDog

trabajar() cargaAcciones()

ProductoHam ProductoHot

RobotHamburguesa

trabajar() cargaAcciones()

<<interface>> Robot

trabajar() cargaAcciones()

RobotHotDog

trabajar() cargaAcciones()

RobotHamburguesa

trabajar() cargaAcciones()

RobotHotDog

cargaAcciones()

Builder

Construir()

-constructor <<interface>>

Robot

trabajar() cargaAcciones()

Objetivo: ◦ Crear nuevos objetos copiando una instancia

prototípica Nombres: ◦ Prototipo

Ejemplo: ◦ Editor de partituras musicales

Cuando las clases a instanciar sean especificadas en tiempo de ejecución

Para evitar jerarquías de clases de fábricas con jerarquía de clases de productos

Cuando las instancias de clases puedan tener un estado de entre un conjunto reducido

Añadir y eliminar productos en tiempo de ejecución

Especificar nuevos objetos modificando valores

Especificar nuevos objetos variando la estructura

Reduce la herencia Configurar dinámicamente una aplicación con

clases

Prototype

Clonar() : Prototype

Cliente prototipo

1 1

PrototipoConcreto1

Clonar() : Prototype

p = prototipo->Clonar() PrototipoConcreto2

Clonar() : Prototype

devuelven una copia a sí mismos

devuelven una copia a sí mismos

Figura

Clonar() : Figura

PruebaFiguras prototipo

1 1

Circulo

Clonar() : Figura

p = circulo.Clonar() Cuadrado

Clonar() : Figura

devuelven una copia a sí mismos

devuelven una copia a sí mismos