You are on page 1of 19

Alejandro González Herrera

Tecnólogo en Informática Mención en Análisis y Desarrollo de Sistemas

Patrones de Diseño
Los patrones de diseño describen un problema que ocurre repetidas veces en algún contexto determinado de desarrollo de software, y entregan una buena solución ya probada. Esto ayuda a diseñar correctamente en menos tiempo, ayuda a construir problemas reutilizables y extendibles, facilita la documentación, y facilita la comunicación entre los miembros del equipo de desarrollo.

CLASE 01-2006 SLIDE:

1

2. Hay varias formas de clasificar los patrones de diseño.. 6. Estos patrones se utilizan frecuentemente en la definición de otros patrones. Richard Helm. 5. CLASE 01-2006 SLIDE: 2 .Patrones de creación.Patrones de descomposición. Interfaz. 3. 4.. Este libro.Patrones estructurales. y en la literatura se pueden encontrar varios catálogos.Patrones de concurrencia.Patrones de comportamiento.. también llamado "Gang of Four" (o GoF). popularizó la idea de patrones en el diseño y construcción de software..Patrones de Diseño En 1994 Erich Gamma.Patrones de diseño fundamentales. Esta categoría comprende cinco patrones básicos: Delegación. Inmutable. Marker Interface y Proxy. John Vlissides y Ralph Johnson publicaron uno de los libros más influyentes de esta década: Design Patterns. Unidad 1: Patrones GoF 1....Patrones de Diseño Fundamentales Son los patrones de diseño más importantes y fundamentales. Según su propósito: 1.

Delegación (Delegation) [Grand 98] Ejemplo Caso de la Universidad donde se tienen tres tipos de roles: alumno. La delegación es más apropiada que la herencia en muchas situaciones. Indica cuándo no usar herencia.1. más que heredando de ella. relaciones de tipo es-un-rol-ejecutado-por son mal modeladas con herencia. escribiendo una clase adicional con funcionalidad extra que usa instancias de la clase original para proveer su propia funcionalidad. Por ejemplo. ya que estos tipos de relaciones son de naturaleza estática.1. En este tipo de relaciones. La delegación es una forma de extender el comportamiento de una clase mediante llamadas a métodos de otra clase.Patrones de Diseño Fundamentales 1. Es posible representar esta situación mediante una clase llamada Persona (o Persona-universitaria) que tiene las subclases correspondientes a cada uno de los roles. La delegación es una forma de extender y reutilizar la funcionalidad de una clase.Delegación (Delegation) [Grand 98] Este es un patrón fundamental de tipo estructural. Persona Alumno Profesor Funcionario CLASE 01-2006 SLIDE: 3 ..Unidad 1: Patrones GoF 1. instancias de una clase pueden jugar múltiples roles.Delegación (Delegation) [Grand 98] Nombre Objetivo 1. la herencia es útil para modelar relaciones de tipo es-un o es-una. Descripción Unidad 1: Patrones GoF 1.Patrones de Diseño Fundamentales 1. profesor y funcionario.. Sin embargo.1.

ProfesoryAlumno.. es posible representar personas en diferentes roles usando delegación. Alguien podría ser funcionario y a la vez estar estudiando una carrera. La herencia es una relación estática que no cambia con el tiempo. Alumno 0. En este tipo de situaciones. el número de subclases que se necesitan. AlumnoyProfesoryFuncionario.Patrones de Diseño Fundamentales 1.Delegación (Delegation) [Grand 98] Problema Ejemplo El problema del diagrama ejemplo. CLASE 01-2006 SLIDE: 4 .1. Pero el problema más serio se presenta cuando la misma persona puede jugar combinaciones distintas de roles en distintos tiempos.1.1 Usa Usa 1 1 Persona 1 Usa Funcionario 0. Unidad 1: Patrones GoF 1. se necesitarían 7 subclases de Persona: Alumno.1 Profesor 0.. ProfesoryFuncionario...Patrones de Diseño Fundamentales 1. alguien podría ser profesor y estar ocupando un puesto administrativo.Delegación (Delegation) [Grand 98] Solución Ejemplo Para resolver esta situación.1 La solución general propuesta en este patrón es: incorporar la funcionalidad de la clase original usando una instancia de la clase original y llamando sus métodos. FuncionarioyAlumno. se incrementa exponencialmente con el número de roles (por ejemplo. Funcionario. Profesor. se necesitarían 63 subclases para modelar 6 roles). es que una misma persona puede jugar más de un rol al mismo tiempo.Unidad 1: Patrones GoF 1. Del mismo modo.. Para modelar adecuadamente esta situación.

Interfaz (Interface) [Grand 98] Ejemplo La clase Cliente usa otras clases que implementan la interfaz IndirecciónIF. Usando indirección. esta clase interfaz provee a sus clases herederas acceso uniforme a métodos y atributos específicos.Patrones de Diseño Fundamentales 1.Patrones de Diseño Fundamentales 1.. los patrones Interfaz y Delegación son usados juntos. Descripción Unidad 1: Patrones GoF 1. Interfaz (Interface) [Grand 98] Nombre Objetivo 1. Cliente 1 Usa 1 <<Interfaz>> Indirección Servicio CLASE 01-2006 SLIDE: 5 . Este patrón es utilizado en el lenguaje Java para proveer herencia múltiple.Unidad 1: Patrones GoF 1.2. Mantiene una clase (la interfaz) que usa datos y servicios provistos por otras clases independientes. sin que deban saber a cuál clase específica pertenecen.2.2.. Por lo general. Interfaz (Interface) [Grand 98] Es un patrón fundamental de tipo estructural. para proveer un acceso uniforme. Muchos otros patrones usan el patrón Interfaz. La interfaz IndirecciónIF provee la indirección que mantiene a la clase Cliente independiente de las clases que proveen los servicios (clase Servicios).

ríos. Para diseñar las clases del programa. donde se tiene un escenario con ciertos objetos (árboles. donde se usan instancias de clases que son compartidas por múltiples objetos. Este patrón es usado en muchos contextos.Unidad 1: Patrones GoF 1. Si las modificaciones y consultas al objeto compartido son realizadas asincrónicamente. y reduce el costo (overhead) de los accesos concurrentes a un objeto. o aparecen en distintas posiciones del mismo escenario en otras etapas del juego. etc.. Descripción Unidad 1: Patrones GoF 1. en el código implementado se debe sincronizar los accesos. podría ser de la siguiente forma.Patrones de Diseño Fundamentales Nombre Objetivo 1. Estos objetos ocasionalmente se mueven dentro del escenario. Inmutable (Immutable) [Grand 98] Este patrón incrementa la robustez de objetos que comparten referencias al mismo objeto. CLASE 01-2006 SLIDE: 6 .. en la cual es fácil cometer errores.Patrones de Diseño Fundamentales 1.). Inmutable (Immutable) [Grand 98] Ejemplo Suponer la creación de un juego. rocas. organizando una clase de tal forma que la información del estado de sus instancias nunca cambia después de que son creadas. Este patrón también evita la necesidad de sincronizar múltiples threads en ejecución que comparten un objeto. entonces para que el funcionamiento sea el correcto.3. Cuando múltiples objetos comparten el acceso a un mismo objeto. se decide usar objetos inmutables para representar la posición de los objetos en el campo de juego. Esto requiere una programación cuidadosa.3. El patrón Inmutable evita estos problemas. La organización de una clase para modelar estas posiciones. y cuyos estados son más frecuentemente "consultados" que "modificados". se pueden presentar problemas si cambios en el objeto compartido no son adecuadamente coordinados.

en lugar de modificar el estado de un objeto ya existente. la clase Object de Java. este patrón recomienda que para evitar la administración de la propagación y sincronización de cambios en el estado de los objetos. (2) Cualquier método que calcula un nuevo estado. Inmutable (Immutable) [Grand 98] Solución En síntesis. Dado que Object es la última superclase en la jerarquía de Java.Patrones de Diseño Fundamentales Nombre Objetivo 1..4.Patrones de Diseño Fundamentales 1. se usen múltiples objetos de ese tipo. Descripción CLASE 01-2006 SLIDE: 7 .Unidad 1: Patrones GoF 1. todas las otras clases heredan el método equals.3. es decir. Marker Interface [Grand 98] Usa interfaces que no declaran métodos ni variables para indicar atributos semánticos en una clase. Por ejemplo. Este método retorna verdadero (true) si el objeto pasado como parámetro es del mismo tipo que el objeto que invoca el llamado. deshabilitando cualquier cambio en su estado después de construido. Unidad 1: Patrones GoF 1.. define un método llamado equals que tiene como argumento una referencia a cualquier otro objeto. deben sobreescribirlo apropiadamente. Hay entonces dos aspectos en la implementación de este patrón: (1) Ningún método (a excepción del constructor) debe modificar los valores de las variables de instancia de la clase. Es particularmente útil cuando clases utilitarias deben determinar algo acerca de objetos sin asumir que son instancias de una clase particular. haciendo estos objetos inmutables. debe almacenar la información en una nueva instancia de la misma clase. Las clases que quieren ofrecer este método a sus instancias.

Patrones de Diseño Fundamentales 1. como java. Marker Interface [Grand 98] Problema Objetos contenedores. El problema es que no hay forma de determinar si una clase sobreescribe o no el método equals.Patrones de Diseño Fundamentales 1.4. llamada por ejemplo OverrideEquals. Marker Interface [Grand 98] Solución Este patrón sugiere que cuando una clase A necesite determinar si una instancia de otra clase B está incluida en una determinada clasificación. se dice que es una Marker Interface. esto no funciona adecuadamente si alguna de las clases de objetos almacenadas en el contenedor no sobreescriben el método equals. sin conocer la clase A a la clase B. es suficiente que la clase A determine si la clase B implementa una interfaz marcada. Una interfaz que no declara métodos ni variables.. que sugiera sobre cuáles clases es correcto usar equals.Unidad 1: Patrones GoF 1. para saber si un objeto es una instancia de una interfaz o de cualquier otra clase. CLASE 01-2006 SLIDE: 8 . pueden invocar al método equals cuando ejecutan búsquedas para determinar si alguno de los objetos que contiene es igual a un objeto dado. Sin embargo. Para solucionar esto es posible definir una interfaz.Vector.4. (Nota: Las clases pueden implementar cualquier número de interfaces). (Nota: En Java. sin métodos ni atributos.. y que es usada para indicar atributos de las clases que la implementan. Unidad 1: Patrones GoF 1. se usa el comando instanceof).util.

. delegando luego las llamadas a los métodos de los objetos respectivos. los objetos cliente no se dan cuenta que están invocando métodos en el proxy. CLASE 01-2006 SLIDE: 9 . Debe ser combinado con algún comportamiento que requiera un servicio de administración para aprovecharlo. y piensan que los están invocando directamente en los objetos respectivos. Un objeto proxy provee alguna administración requerida para los servicios. De esta manera.Patrones de Diseño Fundamentales Nombre Objetivo 1.Unidad 1: Patrones GoF 1. Para que la administración sea transparente. se fuerce a que todos los accesos a estos servicios pasen a través de un objeto proxy.Patrones de Diseño Fundamentales 1. Un objeto proxy es un objeto que recibe llamados a métodos que pertenecen a otros objetos. sino que invoca los métodos en el objeto específico que provee cada servicio.. Buschmann 96] Es un patrón muy general que ocurre frecuentemente en muchos otros patrones.5. Proxy [Gamma 95. Proxy [Gamma 95. El patrón obliga a que las llamadas a métodos de un objeto ocurran indirectamente a través de un objeto proxy. o de una misma interfaz. Los objetos clientes llaman a los métodos de los objetos proxy. Este patrón no es útil en su forma pura. el objeto proxy y el objeto que provee el servicio deben ser instancias de una misma superclase. Por lo general un objeto proxy comparte una interfaz o superclase común con el objeto que realmente provee el servicio. Descripción Unidad 1: Patrones GoF 1. que actúa como sustituto del objeto original. Buschmann 96] Problema Este patrón sugiere que cuando se necesite tener una administración transparente de ciertos servicios provistos por otros objetos.5. El objeto proxy no provee directamente el servicio que el cliente espera.

Problema CLASE 01-2006 SLIDE: 10 . Para crear un diseño de aplicación. Como la subclase particular de documento para la instanciación específica. La clase de aplicación sólo sabe cuando un nuevo documento debería ser creado. la clase de aplicación no puede predecir que la subclase de Documento instancia a a la clase. no que tipo de Documento crear. pero esto sólo sabe de clases abstractas. que permite a las subclases decidir a que clase instanciar. En algunas ocasiones existe más de un patrón que se puede aplicar a la misma situación. Unidad 1: Patrones GoF 2. Esto crea un dilema: El framwork debe instanciar clases. Método de Fábrica (Factory Method) [Gamma 95] Nombre 2.cuando el usuario seleccione Nuevo de un menú.1. constructor.1. Los patrones más comunes en esta categoría son: Método de fábrica. Considerar un framework que puede presentar múltiples documentos al usuario. por ejemplo. Fábrica abstracta. Patrones de Creación Proveen ayuda a la hora de crear objetos. El patrón deja la instaciación de una clase a sus subclases (como un constructor virtual). En otras ocasiones se pueden combinar múltiples patrones convenientemente. Método de Fábrica (Factory Method) [Gamma 95] Objetivo Definir un interfaz para crear un objeto. Esta toma de decisiones puede ser dinámica. prototipo. Patrones de Creación 2. definimos las clases DrawingApplication y DrawingDocument. La clase de aplicación es responsable de manejar Documentos y los creará como sea requerido . por ejemplo. Estos patrones ayudan a estructurar y encapsular estas decisiones. Singular y Caja de objetos. Dos abstracciones claves en este marco son las clases de aplicación y el Documento. principalmente cuando esta creación requiere tomar decisiones.Unidad 1: Patrones GoF 2. Ambas son abstractas. Muchas veces hay que decidir cuál patrón aplicar.

Esto sugiere una organización que incluya una clase abstracta Documento independiente de la aplicación. Además. Supongamos que queremos crear los métodos de la clase Application. hay operaciones. para especificar los tipos de documentos. Unidad 1: Patrones GoF 2. Debe incluir operaciones comunes de alto nivel.1. Sin embargo. Debido a esto. la clase Application usualmente delega la mayoría de los comandos a algún tipo de objeto documento. Patrones de Creación 2. Estas aplicaciones están típicamente organizadas de una forma "centradas en documentos“. La mayoría de los métodos de esta clase varían según el tipo de documento. Una vez que una subclase de aplicación es instanciada. la lógica de las operaciones del objeto documento puede variar según el tipo de documento. esta puede instanciar un específico Documento sin conocer su clase. que son comunes para todos los objetos documento. Método de Fábrica (Factory Method) [Gamma 95] Ejemplo Crear un framework para el desarrollo de aplicaciones tipo Office. abrir o guardar documentos. Patrones de Creación 2. como por ejemplo desplegar el string con el título del documento o desplegar una imagen . Método de Fábrica (Factory Method) [Gamma 95] Solución Encapsula el conocimiento de cual subclase de Documento crear y mueve este conocimiento fuera del framwork. Las operaciones usualmente empiezan con un comando para crear o editar un documento.gif.Unidad 1: Patrones GoF 2. Subclases de aplicación redefinen una operación abstract de CreateDocument sobre la aplicación para retornar el Documento apropiada a la sub clase. como crear. Se llama a CreateDocument un “método de la fábrica” porque es responsable "de fabricar" un objeto.1. puede reconocer diferentes tipos de archivos. En el caso de un editor de texto. CLASE 01-2006 SLIDE: 11 .

sin ser ella misma una aplicación específica. se puede encapsular la lógica e instanciar subclases de la clase Documento específicas a la aplicación en una interfaz.1. Patrones de Creación 2. Patrones de Creación 2.1. Método de Fábrica (Factory Method) [Gamma 95] Ejemplo I Solicitante Producto Producto Concreto Interfaz de Fabrica Fabrica CLASE 01-2006 SLIDE: 12 . Unidad 1: Patrones GoF 2. Método de Fábrica (Factory Method) [Gamma 95] Ejemplo Lo que no queda claro es cómo un objeto Applicación puede crear instancias de clases de documentos específicos para esa aplicación.Unidad 1: Patrones GoF 2. Para lograr esto.

Hay también una clase abstracta para cada clase de widgets.Unidad 1: Patrones GoF 2.2. no debería el código prestar sus widgets para una mirada particular y el sentido. Los clientes llaman estas operaciones para obtener casos de widgets. pero los clientes no son conscientes de las clases concretas que ellos usan. Objetivo Problema Unidad 1: Patrones GoF 2. y botones.2. Así los clientes se quedan independientes del aspecto predominante y el sentido. Patrones de Creación Nombre 2. Patrones de Creación 2. Para ser portátil su uso. El interfaz de WidgetFactory tiene una operación que devuelve un nuevo objeto de widget para cada clase de widget abstracta. CLASE 01-2006 SLIDE: 13 . como el Administrador de Presentación. Fábrica Abstracta (Abstract Factory) [Gamma 95] 2. Fábrica Abstracta (Abstract Factory) [Gamma 95] Provee una interfaz para la creación de familiaridades o dependencias de objetos sin necesidad de especificar con que clases concretas. El aspecto y uso define apariciones diferentes y comportamientos para el interfaz de usuario “widgets" como barras de desplazamiento. ventanas. Fábrica Abstracta (Abstract Factory) [Gamma 95] Solución Definir un resumen WidgetFactory la clase que declara una interfaz para crear cada clase básica de widgets. Considerando un juego de herramientas de interfaz de usuario que apoya múltiples estándares de aspecto y uso. y widgets de subclases concretas para estándares de aspecto y uso específicas.2.

listas. Para hacerlo robusto. Patrones de Creación 2. Para construir el framework. se puede crear una clase abstracta para cada tipo de objeto (texto.) y luego reescribir una subclase concreta de cada clase de objeto para cada plataforma. Cada plataforma tiene una forma nativa de desplegar cada componente (look and feel). Fábrica Abstracta (Abstract Factory) [Gamma 95] Ejemplo CLASE 01-2006 SLIDE: 14 . que trabaje sobre múltiples plataformas gráficas (Windows.). etc. Unidad 1: Patrones GoF 2. Fábricas concretas son subclases concretas de una fábrica abstracta que implementa sus métodos para crear instancias de clases de objetos concretos para una misma plataforma. En esta situación. una clase fábrica abstracta define métodos para crear una instancia de cada clase abstracta que representa un objeto de la interfaz de usuario. Patrones de Creación 2. botones. etc.Unidad 1: Patrones GoF 2. hay que asegurarse además que todos los objetos creados son de la plataforma deseada. MacOSX. Fábrica Abstracta (Abstract Factory) [Gamma 95] Ejemplo Construir un framework para crear interfaces de usuario.2.2. Linux.

3. Un lector para texto RTF. esto usa el TextConverter para realizar la conversión. Patrones de Creación Nombre 2. sin embargo. Entonces se debería poder añadir una nueva conversión sin modificar al lector. Patrones de Creación 2. Constructor (Builder) [Gamma 95] 2. es que el número de conversiones posibles es ampliable. Constructor (Builder) [Gamma 95] Separar la construcción de objetos complejos de su representación de modo que el mismo proceso de construcción pueda crear representaciones diferentes.Unidad 1: Patrones GoF 2. Objetivo Problema Unidad 1: Patrones GoF 2. esto emite una petición al TextConverter para convertir la señal.3. El lector podría convertir documentos RTF en texto ASCII simple u otro widget de texto que puede ser corregida interactivamente. el formato para el cambio de documento debería ser capaz de convertir RTF a muchos formatos de texto.3. El problema. Constructor (Builder) [Gamma 95] Solución Configurar una clase (RTFREADER) con un objeto de TextConverter que convierte RTF a otra representación textual. Siempre que el RTFREADER reconozca una señal RTF (texto simple o una palabra de control de RTF). CLASE 01-2006 SLIDE: 15 . Objetos TextConverter son responsable tanto de realizar la conversión de datos como de representar la señal en un formato particular. Como la clase analiza el documento RTF.

Esto se hace dando un objeto prototipo a otro objeto que inicia la creación de los nuevos objetos.3. Constructor (Builder) [Gamma 95] Solución Tipo Unidad 1: Patrones GoF 2. Patrones de Creación 2.4. Problema CLASE 01-2006 SLIDE: 16 . Patrones de Creación 2. El objeto creador crea nuevos objetos preguntando al objeto prototipo cómo hacer copias de ellos mismos. Constructor (Builder) [Gamma 95] Objetivo Este patrón permite a un objeto crear otros objetos "a la medida" sin necesidad de conocer las clases exactas o los detalles de cómo crearlas.Unidad 1: Patrones GoF 2.3. Prototipo (Prototype) [Gamma 95] Nombre 2.

usan la misma instancia. es asegurar que solamente exista una instancia de la clase. Patrones de Creación 2.Unidad 1: Patrones GoF 2. Una forma de lograr esto.4. compartida por todos los objetos que usan la clase. Para evitar que dos clips de audio sean ejecutados al mismo tiempo.5. la clase que escribamos debe dejar de ejecutar un clip de audio antes de empezar a ejecutar el siguiente.5. Patrones de Creación 2. Problema CLASE 01-2006 SLIDE: 17 . Algunas clases deben tener exactamente una instancia. Por ejemplo. necesitar escribir una clase que un applet pueda usar para asegurar que no más de un clip de audio sea ejecutado al mismo tiempo. Singular (Singleton) [Gamma 95] Nombre 2. Prototipo (Prototype) [Gamma 95] Solución Tipo Unidad 1: Patrones GoF 2. Todos los objetos que usan una instancia de esa clase. Estas clases usualmente involucran la administración centralizada de algún recurso. Singular (Singleton) [Gamma 95] Objetivo Este patrón asegura que sólo una instancia de la clase es creada.

para acceder a una instancia de la clase deben usar el método getInstance. Singular (Singleton) [Gamma 95] Solución El constructor de la clase es privado.Unidad 1: Patrones GoF 2.6. Problema CLASE 01-2006 SLIDE: 18 . Patrones de Creación 2. Patrones de Creación 2. y siempre regresa la misma instancia de la clase. Esto previene que otras clases creen directamente una instancia de la clase. Caja de Objetos (Object Pool) [Grand 98] Nombre 2. En lugar de eso. Este método es estático. Caja de Objetos (Object Pool) [Grand 98] Objetivo Administra la reutilización de objetos cuando un tipo de objeto es "caro" de crear o cuando solamente se pueden crear un número limitado de objetos.5. Unidad 1: Patrones GoF 2.6.

Preguntas ? Dudas ? Comentarios CLASE 01-2006 SLIDE: 19 .