principios básicos de la usabilidad pdf

49
UNIVERSIDAD GERARDO BARRIOS MATERIA: Ingeniería de software II DOCENTE: Lic. Carla Milagros López Vásquez ESTUDIANTE: Kevin Mauricio Artiga Núñez usts044913 TRABAJO Patrones de diseño web CARREAR: Tec. En Ing. En sistemas y redes informáticas FACULTAD: Ciencia y tecnología

Upload: kevin-artiga

Post on 08-Apr-2016

228 views

Category:

Documents


1 download

DESCRIPTION

patrones de diseño web

TRANSCRIPT

Page 1: Principios básicos de la usabilidad pdf

UNIVERSIDAD GERARDO BARRIOS

MATERIA:

Ingeniería de software II

DOCENTE:

Lic. Carla Milagros López Vásquez

ESTUDIANTE:

Kevin Mauricio Artiga Núñez usts044913

TRABAJO

Patrones de diseño web

CARREAR:

Tec. En Ing. En sistemas y redes informáticas

FACULTAD:

Ciencia y tecnología

Page 2: Principios básicos de la usabilidad pdf

PATRONES DE DISEÑO WEB

PRINCIPIOS BÁSICOS DE LA USABILIDAD WEB

El diseño de sitios web deben seguir los siguientes principios:

1. Anticipación, el sitio web debe anticiparse a las necesidades del usuario.

2. Autonomía, los usuarios deben tener el control sobre el sitio web. Los usuarios sienten que

controlan un sitio web si conocen su situación en un entorno abarcable y no infinito.

3. Los colores han de utilizarse con precaución para no dificultar el acceso a los usuarios con

problemas de distinción de colores (aprox. un 15% del total).

4. Consistencia, las aplicaciones deben ser consistentes con las expectativas de los usuarios, es

decir, con su aprendizaje previo.

5. Eficiencia del usuario, los sitios web se deben centrar en la productividad del usuario, no en

la del propio sitio web. Por ejemplo, en ocasiones tareas con mayor número de pasos son más

rápidas de realizar para una persona que otras tareas con menos pasos, pero más complejas.

6. Reversibilidad, un sitio web ha de permitir deshacer las acciones realizadas

7. Ley de Bits indica que el tiempo para alcanzar un objetivo con el ratón está en función de la

distancia y el tamaño del objetivo. A menor distancia y mayor tamaño más facilidad para usar

un mecanismo de interacción.

8. Reducción del tiempo de latencia. Hace posible optimizar el tiempo de espera del usuario,

permitiendo la realización de otras tareas mientras se completa la previa e informando al

usuario del tiempo pendiente para la finalización de la tarea.

9. Aprendizaje, los sitios web deben requerir un mínimo proceso de aprendizaje y deben poder

ser utilizados desde el primer momento.

10. El uso adecuado de metáforas facilita el aprendizaje de un sitio web, pero un uso inadecuado

de estas puede dificultar enormemente el aprendizaje.

11. La protección del trabajo de los usuarios es prioritario, se debe asegurar que los usuarios

Page 3: Principios básicos de la usabilidad pdf

nunca pierden su trabajo como consecuencia de un error.

12. Legibilidad, el color de los textos debe contrastar con el del fondo, y el tamaño de fuente

debe ser suficientemente grande.

13. Seguimiento de las acciones del usuario. Conociendo y almacenando información sobre su

comportamiento previo se ha de permitir al usuario realizar operaciones frecuentes de manera

más rápida.

14. Interfaz visible. Se deben evitar elementos invisibles de navegación que han de ser inferidos

por los usuarios, menús desplegables, indicaciones ocultas, etc.

Otros principios para el diseño de sitios web son:

a) Los usuarios deben ser capaces de alcanzar sus objetivos con un mínimo esfuerzo y unos

resultados máximos.

b) Un sitio web no ha de tratar al usuario de manera hostil. Cuando el usuario comete un error

el sistema ha de solucionar el problema, o en su defecto sugerir varias soluciones posibles, pero

no emitir respuestas que meramente informen del error culpando al usuario.

c) En ningún caso un sitio web puede venirse abajo o producir un resultado inesperado. Por

ejemplo no deben existir enlaces rotos.

d) Un sitio web debe ajustarse a los usuarios. La libertad en el uso de un sitio web es un término

peligroso, cuanto mayor sea el número de acciones que un usuario pueda realizar, mayor es la

probabilidad que cometa un error. Limitando el número de acciones al público objetivo se

facilita el uso de un sitio web.

e) Los usuarios no deben sufrir sobrecarga de información. Cuando un usuario visita un sitio

web y no sabe dónde comenzar a leer, existe sobrecarga de información.

f) Un sitio web debe ser consistente en todos los pasos del proceso. Aunque pueda parecer

apropiado que diferentes áreas tengan diseños diferentes, la consistencia entre los diseños

facilita al usuario el uso de un sitio.

g) Un sitio web debe proveer de un feedback a los usuarios, de manera que éstos siempre

conozcan y comprendan lo que sucede en todos los pasos del proceso

Hablamos de usabilidad web -concepto clave para diseñadores- al referirnos a facilidad de

acceso, ubicación y navegación

Cómo diseñar una página web es uno de los aspectos más importantes de un sitio web y las

técnicas para que pueda ser entendible y sencillo de explorar por parte del usuario resultan

determinantes.

Page 4: Principios básicos de la usabilidad pdf

La usabilidad web se centra en la necesidad del usuario de tener accesibilidad web, ubicación y

navegación dentro de una página web. Que todo sea claro y estructurado para no complicar al

visitante y tener el riesgo de perderlo en pocos segundos.

El diseñador web es un personaje clave en la creación del sitio web, ya que no debe actuar no

con la estética o el gusto subjetivo como prioridades, sino más bien pensar en el usuario.

Page 5: Principios básicos de la usabilidad pdf

Principios de usabilidad web

El contenido de Internet tiene sus propias características con respecto a otros medios y apuesta

por textos más resumidos y atractivos. El diseño debe contar con una navegación simple y clara,

unos textos precisos y una estructura “amigable” para la mayoría de los usuarios.

Los principales conceptos en torno a la usabilidad web son los siguientes:

::. Visibilidad: Es importante que el usuario pueda reconocer los diferentes elementos de

manera sencilla, sin mayor esfuerzo.

::. Consistencia: Una información debe ser reiterada de diferentes formas pero debe ser

siempre la misma. Tiene que haber una definición en torno a los patrones de la página web y la

experiencia del usuario para no crear confusión.

::. Compatibilidad: El sitio web debe adecuarse a la forma de pensar del usuario promedio, del

cliente potencial y el público meta. En estética y funcionalidad, los procesos deben adaptarse a

las expectativas de los visitantes.

::. Eficiencia: Debes reducir el trabajo del usuario en todos los niveles, facilitar el camino para

que pueda encontrar la información que desea o que pueda retroceder en caso de hallar un

resultado indeseado. Hay que predecir los posibles pasos a seguir del visitante y prevenir los

errores.

Un buen consejos es siempre tener en cuenta quiénes serán los usuarios habituales de la página

web y así enfocar el diseño en ese camino, tomando en cuenta su experiencia y nivel de

conocimiento.

Page 6: Principios básicos de la usabilidad pdf

Errores de usabilidad web

Sin importar la cantidad de visitas que puede tener un sitio web o las ganancias que obtenga

por determinado servicio o producto, es fácil detectar algunos problemas para el uso del

usuario promedio.

Algunas de estas fallas de usabilidad web son las siguientes:

::. Logan ocultos: Es suficientemente complicado lograr interesar a un usuario para que se

registre en una página web, por lo que no tener un acceso visible para usuario y contraseña

::. Pop-ups: Prácticamente todos los navegadores tienen bloqueadores de pop-ups, por lo que

las ventanas emergentes han pasado a ser una molestia y no son la mejor manera de presentar

contenido.

::. Links invisibles: La navegación es una importante importante, por lo que no encontrar los

enlaces necesarios para movilizarse a través de la página web puede traer problemas

importantes.

::. Sobrecarga visual: Muchas veces, más es menos. El “ruido” visual es uno de los problemas

comunes que los diseñadores provocan o deben resolver de acuerdo con la necesidad del

cliente.

::. Menú desplegable: Ocultar opciones en un menú desplegable ahorra espacio pero complica

la navegación de los usuarios, ya que requiere un esfuerzo para fijar la posición del cursor y

seleccionar esa opción.

DISEÑO WEB FLUIDO O DISEÑO WEB LÍQUIDO

Fluid web designó o liquida web designó, es aquel que tiende a ocupar todo el ancho de la

pantalla, sea cual sea el tamaño de esta. Es un tipo de diseño menos utilizado que el anterior, ya

que requiere de mucho más trabajo por parte del diseñador web y a que si no se realiza

correctamente su resultado puede resultar bastante atractivo para tamaños de pantalla

“normales” y pequeñas, pero cuando se emplean pantallas de muchas pulgadas su estética

resulta, cuanto menos, horrible, a no ser que se utilicen técnicas como el uso de max-width para

limitar el máximo ancho aceptado por nuestro diseño. En este caso el diseñador web utiliza

porcentajes en lugar de píxeles para establecer los anchos de sus diseños, aunque también se

Page 7: Principios básicos de la usabilidad pdf

pueden emplear píxeles y medidas máximas y mínimas con min-whist y max-width. Por suerte

es un tipo diseño que cada vez va tomando más terreno y va sustituyendo al diseño fijo

El diseño web fluido o diseño web líquido, fluid web designó o liquida web designó, es aquel

que tiende a ocupar todo el ancho de la pantalla, sea cual sea el tamaño de esta. Es un tipo de

diseño menos utilizado que el anterior, ya que requiere de mucho más trabajo por parte del

diseñador web y a que si no se realiza correctamente su resultado puede resultar bastante

atractivo para tamaños de pantalla “normales” y pequeñas, pero cuando se emplean pantallas

de muchas pulgadas su estética resulta, cuanto menos, horrible, a no ser que se utilicen técnicas

como el uso de max-width para limitar el máximo ancho aceptado por nuestro diseño. En este

caso el diseñador web utiliza porcentajes en lugar de píxeles para establecer los anchos de sus

diseños, aunque también se pueden emplear píxeles y medidas máximas y mínimas con min-

width y max-width. Por suerte es un tipo diseño que cada vez va tomando más terreno y va

sustituyendo al diseño fijo

DISEÑO WEB HIBRIDO

Diseño web hibrido es una adaptación o combinación de dos estándares…un ejemplo de eso es

mashup

En desarrollo web, una mashup es una forma de integración y reutilización. Ocurre cuando de

una aplicación web es usada o llamada desde otra aplicación, con el fin de reutilizar su

contenido y/o funcionalidad. El uso en otra(s) fuente(s), para crear nuevos servicios simples,

visualizado en una única interfaz gráfica diferente. Por ejemplo, se pueden combinar las

direcciones y fotografías de las ramas de una biblioteca con un mapa de Google Maps para crear

un mashup de mapa.

El término implica integración fácil y rápida, a menudo usando varias API abiertas y fuentes de

datos para producir resultados enriquecidos, que no fueron necesariamente el motivo original

de producir la fuente primaria de datos.

El contenido usado en mashups es típicamente obtenido de otra fuente vía una interfaz pública

o API (web services), aunque existe gente en la comunidad que considera que los casos en que

las interfaces son privadas no deberían contar como mashups. Otros métodos de obtener

contenido para mashups incluyen Web Feeds (por ejemplo: RSS oAtom) y screen scraping.

Mucha gente experimenta con mashups usando las API de Amazon, eBay, Flickr, Google,

Microsoft, Yahoo o YouTube; lo que ha llevado a la creación de un editor mashup.

La arquitectura de los mashups está siempre compuesta de tres partes:

El proveedor de contenidos: fuente de los datos. Los datos están disponibles vía una API y

diferentes protocolos web como RSS, REST y Web Service.

El sitio mashup: es la nueva aplicación web que provee un nuevo servicio utilizando diferente

información y de la que no es dueña.

Page 8: Principios básicos de la usabilidad pdf

El navegador web cliente: es la interfaz de usuario del mashup. En una aplicación web, el

contenido puede ser mezclado por los web browser clientes usando lenguaje web del lado del

cliente, por ejemplo, JavaScript.

Los mashups deben ser diferenciados de simples embebidos de datos de otro sitio para formar

un documento compuesto. Un sitio que permite al usuario embeber vídeos deYoutube, por

ejemplo, no es un sitio mashup. Como ya se dijo, el sitio mismo debe acceder información

externa a él usando una API y procesar esos datos de modo que incrementen su valor para el

usuario

Los mashups se presentan actualmente en tres formas: mashups de consumidores, mashups de

datos y mashups empresariales.

El tipo más conocido es el de mashup de consumidores, que está muy bien ejemplificado por

muchas aplicaciones que utilizan Google Maps. Los mashups de este tipo combinan datos de

fuentes varias, ocultando este hecho tras una interfaz gráfica simple.

Un mashup de negocio es una combinación de todo lo anterior, enfocando en agregación de

datos y presentación y agregando adicionalmente una funcionalidad colaborativa, haciendo que

el resultado final sea una aplicación de negocio apropiada.

Mashups dentro de mashups son conocidos como “mashups monstruos”.

DISEÑO PARA WEB MÓVILES

Decálogo de consejos de usabilidad para la web móvil

A continuación voy a listar hasta 10 consejos que nos pueden ayudar a construir sitios web más

usables en dispositivos móviles. Algunos son más prácticos que otros, algunos también más

obvios que otros.

La regla fundamental: Menos es más

Debemos comenzar comentando la regla fundamental para el diseño web móvil y aunque pueda

parecer un tópico, el dicho que "Menos es más" se ajusta perfectamente a la realidad. Cuando

diseñamos para móviles nos sobra cualquier tipo de floritura, contenido superfluo o cualquier

accesorio prescindible.

Como venimos diciendo, el usuario que se conecta a nuestro sitio web desde un móvil no lo

suele hacer por entretenimiento, sino porque quiere obtener alguna información o servicio. Lo

quiere rápido, y ligero, así que debemos satisfacerle en la medida de lo posible. Cuanto menos

distracciones, mejor para el usuario y por añadidura, mejor para nosotros.

Consejos del W3C

Antes que nada quiero nombrar una fuente totalmente reconocida y recomendaros su consulta.

Se trata, nada más y nada menos que el propio Consorcio de las Tres Uves Dobles, W3C para los

amigos. Una organización que a día de hoy no necesita más presentación y que nos ofrece una

lista bastante interesante de consejos que nos ayudarán a crear webs más usables cuando se

acceden desde dispositivos.

Page 9: Principios básicos de la usabilidad pdf

El informe está en inglés y se llama Mobile Best Practices. Cabe señalar que, por contra de lo

que muchas veces nos tienen acostumbrados desde la W3C, en este caso el texto es bastante

sencillo de leer y de entender.

1.- Ten en cuenta la diversidad de pantallas

Como primer punto, lo más fundamental en torno de los dispositivos móviles, las sensibles

diferencias de tamaños de pantallas y de resolución. Ten en cuenta que estás diseñando para

pantallas por lo general pequeñas, pero además que existen distintos tipos de definiciones. Si

en ordenadores de escritorio ya debíamos tener en cuenta este detalle, al desarrollar para

móviles todavía cobra mayor importancia.

2.- El foco no es tu sitio

Lo dicho anteriormente, quizás los usuarios están accediendo a tu sitio mientras llevan a cabo

otras tareas, así que no vas a pretender que el visitante tenga los 5 sentidos dedicados a tu web.

Analiza qué es lo que quieres mostrar, sintetiza, llama la atención sobre los puntos que

consideres más importantes y descarta aquellos que no merezcan la pena. En la medida de lo

posible, reduce la cantidad de contenido que estás distribuyendo en tu página para móviles.

3.- El layout debe estar pensado para móviles

En la web de escritorio utilizamos rejillas que tienen 12 o 16 columnas, sin embargo, en la web

para móviles quizás con una columna tienes más que suficiente. En cualquier caso, ten en cuenta

que funcionan mejor los layouts fluidos, que se adaptan a la anchura de cada tipo de pantalla. Si

vas a utilizar varias columnas, considera 2 o 3 a lo sumo. Sin embargo, también es cierto que

algunos dispositivos como los tablets pueden soportar perfectamente layouts más complejos,

por lo que no existe una regla fija. Lo mejor sería tener varios layouts y utilizar uno u otro

dependiendo de las dimensiones de la pantalla. Más adelante veremos cómo hacer eso.

4.- La navegación en la parte de arriba no suele funcionar

En la web para escritorio es habitual tener un navegador en la parte de arriba de la página, con

un listado de las secciones principales de un sitio web. Pero debemos tener en cuenta que en

dispositivos de movilidad, con pantallas pequeñas, ese listado de links puede ocupar todo el

espacio disponible, lo que obligaría al usuario a hacer scroll para ver el contenido de la página.

Algo que no es deseable. En la portada del sitio web puede ser una buena idea mantener la

navegación en la parte de arriba del documento, pero en el resto de páginas queda mejor si la

situamos abajo.

5.- Uso responsable de las imágenes

Esa imagen que en las pantallas de los ordenadores queda tan bien, posiblemente tenga un

tamaño excesivo para visualizarse en una pantalla pequeña de un teléfono. Posiblemente la

definición de la foto sea superior a la de la pantalla de tu dispositivo, con lo que estás

desperdiciando espacio y ancho de banda para su transferencia. Usa imágenes con tamaños

adaptados a móviles y elimina determinados usos de imágenes que aportan poco o nada a la

utilidad de tu documento, como imágenes de fondo, que pueden molestar la lectura más que

otra cosa.

6.- Se trabaja con los dedos y no con el ratón

Este punto es de vital importancia, puesto que la pantalla táctil utiliza el dedo como señalador

Page 10: Principios básicos de la usabilidad pdf

y tiene muchas diferencias con respecto al puntero del ratón de nuestro ordenador personal.

Ten en cuenta detalles como que el espacio para hacer un tap (tap es como se llama al clic

realizado con el dedo sobre una pantalla táctil) es mayor que el que señalaríamos con el puntero

del ratón (se supone que un dedo en la pantalla ocupa entre 40 y 80 píxeles de ancho). Dicho de

otro modo, no se puede comparar la precisión de un clic con el ratón y con el dedo, que puede

cambiar mucho de una persona a otra y también la forma de posicionarlo en la pantalla. En

general tu sitio web funcionará mejor cuando pongas botones o enlaces con tamaño mayor. Así

mismo, sería recomendable dejar un mayor espacio en blanco entre los botones o enlaces de tu

sitio web.

7.- Entrada de texto en teclados virtuales

En el ordenador personal utilizamos un teclado para introducir texto, sin embargo, en

dispositivos móviles se suele usar un teclado virtual que a menudo resulta mucho más

incómodo. Este detalle y varios otros que tienen que ver con la entrada de datos en general lo

veremos en el siguiente artículo sobre usabilidad en formularios optimizados para móviles.

8.- No se dispone de plugins

Flash es el ejemplo más claro de plugin que no disponemos en todos los dispositivos y que por

tanto no deberíamos usar en páginas que queremos que se vean bien en móviles. Pero hay otros,

como los Applets de Java, Shockwave, etc. Sin olvidar que no todos tienen compatibilidad con

ciertas capacidades de scripting. Sugerir la actualización del navegador, o la instalación de otro

cliente web, no es la solución en muchos de los casos, pues no siempre el usuario tiene

oportunidad de actualizar su sistema operativo o instalar otro software para la navegación web.

9.- Los tipos de eventos cambian

El clic en pantallas táctiles se llama Tap. Realmente es un nuevo modo de llamar a la misma

cosa, pero existen otros eventos que sí tienen cambios importantes, o que no están disponibles

en las pantallas táctiles. Por ejemplo, el hover no existe al trabajar con los dedos. Además, hay

otra serie de eventos que sólo existen en móviles como deslizamiento de los dedos, zoom, girar

la pantalla etc.

10.- Existen diversas utilidades específicas que se pueden aprovechar Los dispositivos móviles

a menudo integran algunas habilidades que no se disponen en los ordenadores de escritorio,

como localización geográfica, cámaras, grabación, orientación, etc. En la mayorá de los casos

estos mecanismos sólo se disponen en aplicaciones nativas, pero gracias a HTML 5, algunos ya

están disponibles en sitios web. En el futuro la tendencia es integrar aun más estas capacidades

en la web

PATRONES CREACIONALES

La regla fundamental: Menos es más

Debemos comenzar comentando la regla fundamental para el diseño web móvil y aunque pueda

parecer un tópico, el dicho que "Menos es más" se ajusta perfectamente a la realidad. Cuando

Page 11: Principios básicos de la usabilidad pdf

diseñamos para móviles nos sobra cualquier tipo de floritura, contenido superfluo o cualquier

accesorio prescindible.

Como venimos diciendo, el usuario que se conecta a nuestro sitio web desde un móvil no lo

suele hacer por entretenimiento, sino porque quiere obtener alguna información o servicio. Lo

quiere rápido, y ligero, así que debemos satisfacerle en la medida de lo posible. Cuanto menos

distracciones, mejor para el usuario y por añadidura, mejor para nosotros.

Consejos del W3C

Antes que nada quiero nombrar una fuente totalmente reconocida y recomendaros su consulta.

Se trata, nada más y nada menos que el propio Consorcio de las Tres Uves Dobles, W3C para los

amigos. Una organización que a día de hoy no necesita más presentación y que nos ofrece una

lista bastante interesante de consejos que nos ayudarán a crear webs más usables cuando se

acceden desde dispositivos.

El informe está en inglés y se llama Mobile Best Practices. Cabe señalar que, por contra de lo

que muchas veces nos tienen acostumbrados desde la W3C, en este caso el texto es bastante

sencillo de leer y de entender.

La regla fundamental: Menos es más

Debemos comenzar comentando la regla fundamental para el diseño web móvil y aunque pueda

parecer un tópico, el dicho que "Menos es más" se ajusta perfectamente a la realidad. Cuando

diseñamos para móviles nos sobra cualquier tipo de floritura, contenido superfluo o cualquier

accesorio prescindible.

Como venimos diciendo, el usuario que se conecta a nuestro sitio web desde un móvil no lo

suele hacer por entretenimiento, sino porque quiere obtener alguna información o servicio. Lo

quiere rápido, y ligero, así que debemos satisfacerle en la medida de lo posible. Cuanto menos

distracciones, mejor para el usuario y por añadidura, mejor para nosotros.

Consejos del W3C

Antes que nada quiero nombrar una fuente totalmente reconocida y recomendaros su consulta.

Se trata, nada más y nada menos que el propio Consorcio de las Tres Uves Dobles, W3C para los

amigos. Una organización que a día de hoy no necesita más presentación y que nos ofrece una

lista bastante interesante de consejos que nos ayudarán a crear webs más usables cuando se

acceden desde dispositivos.

El informe está en inglés y se llama Mobile Best Practices. Cabe señalar que, por contra de lo

que muchas veces nos tienen acostumbrados desde la W3C, en este caso el texto es bastante

sencillo de leer y de entender.

Este es un patrón creacional, el problema que intenta solucionar es: la creación de diferentes

familias de objetos relacionados o que dependen entre si, sin especificar sus clases concretas.

Permite trabajar con objetos de distintas familias de manera que las familias no se mezclen

entre si y haciendo transparente el tipo de familia concreta que se esta usando.

Se aplica principalmente a objetos. Tratan con las relaciones entre objetos, que pueden

cambiarse en tiempo de ejecución y son muy dinámicos.

Page 12: Principios básicos de la usabilidad pdf

Clases que participan

FabricaAbstracta: Declara una interfaz para operaciones que crean objetos productoabstractos.

FabricaConcreta: Implementa las operaciones para crear objetos producto concretos.

ProductoAbstracto: Declara una interfaz para un tipo de objeto producto.

ProductoConcreto: Define un objeto producto para que sea creado por la fábrica

correspondiente. Implementa la interfaz ProductoAbstracto.Cliente: Sólo usa interfaces

declaradas por las clases.

Ventajas

Hace fácil el intercambio de familias de productos

Porque en el momento de que requiera lo único que se debe hacer, es cambiar o mejorar una

línea de código

Fomenta la consistencia entre productos.

Encapsula la responsabilidad de creación

Porque aísla las clases concretas y ayuda a mantener un control sobre las clases de datos

Desventajas

Puede ser difícil incorporar nuevos tipos de datos. Pero esto se puede tener solución, pasando un parámetro a los métodos de creación de

productos, pero con esto sacrificaría seguridad.

Patrones relacionados

Singleton: es implementado en la fabrica concreta.

Prototype: es implementado al definir fabricas extensibles y evitar la dependencia de la interfaz

de las fabricas de los nuevos productos se puede tener un catalogo de prototipos.

Factory Method: la fábrica abstracta deja que las subclases creen los productos redefiniendo las

operaciones de creación.

Estructura

Page 13: Principios básicos de la usabilidad pdf

Introducción

El objetivo es conseguir que la construcción de un objeto compuesto sea independiente de su

representación, de manera que la construcción no se vea afectada por el hecho de que cambie

su forma de representación.

Intención

Construir de manera flexible un objeto complejo a partir de otro objeto complejo en una serie

de pasos

Motivación

Los objetos que dependen de un algoritmo tendrán que cambiar cuando el algoritmo cambia.

Por lo tanto los algoritmos que estén expuestos a dicho cambio deberían ser separados,

permitiendo de esta manera reutilizar algoritmos para crear diferentes representaciones.

Aplicabilidad

El patrón Builder se usa cuando:

El algoritmo para creación de un objeto complejo debe ser independiente de las partes que

conforman el objeto y cómo están ensambladas.

El proceso de construcción debe permitir diferentes representaciones del objeto que se

construye.

Participantes

Builder

Especifica una interfaz abstracta para la creación de partes de un objeto Producto.

ConcreteBuilder

Construye y ensambla las partes del producto por implementación de la interfaz Builder.

Define y guarda la ruta de la representación que crea.

Provee una interfaz para recuperación del producto.

Page 14: Principios básicos de la usabilidad pdf

Director

Construye un objeto usando la interfaz Builder.

Product

Representa el objeto complejo en construcción. El ConcreteBuilder construye la representación

interna del producto y define el proceso con el cual se ensambla.

Incluye las clases que definen las partes componentes, incluyendo interfaces para ensamblar

las partes dentro del resultado final.

Estructura

Colaboraciones

El Cliente crea el objeto Director y lo configura con el objeto Builder deseado.

El Director notifica al constructor cuándo una parte del producto se debe construir.

El Builder maneja los requerimientos desde el director y agrega partes al producto.

El Cliente recupera el producto desde el constructor.

Consecuencias

Permite variar la representación interna de un producto

• El Builder ofrece una interfaz al Director para construir un producto y encapsula la

representación interna del producto y cómo se juntan sus partes.

• Si se cambia la representación interna basta con crear otro Bulider que respete la interfaz.

Separa el código de construcción del de representación

• Las clases que definen la representación interna del producto no aparecen en la interfaz del

Bulider

• Cada ConcreteBuilder contiene el código para crear y juntar una clase específica de producto

• Distintos Directors pueden usar un mismo ConcreteBuilder

Da mayor control en el proceso de construcción

• Permite que el Director controle la construcción de un producto paso a paso

• Sólo cuando el producto está acabado lo recupera el director del builder

Page 15: Principios básicos de la usabilidad pdf

Implementación y patrones relacionados

El Builder define las operaciones para construir cada parte

• El ConcreteBuilder implementa estas operaciones

Con la Factoría Abstracta también se pueden construir objetos complejos

• Pero el objetivo del patrón Builder es construir paso a paso

• El énfasis de la Factoría Abstracta es tratar familias de objetos

El objeto construido con el patrón Builder suele ser un Composite

El Método Factoría se puede utilizar por el Builder para decidir qué clase concreta instanciar

para construir el tipo de objeto deseado

El patrón Visitor permite la creación de un objeto complejo,en vez de paso a paso, dando todo

de golpe como objeto visitante

Este es un patrón que se ocupa en la creación de objetos, sin especificar la clase de objeto que

se crear. Factory method se ocupa del problema mediante la definición de un método para crear

los objetos.

A veces, una aplicación en tiempo de ejecución, no puede anticipar la clase de objeto que se

debe crear. La aplicación puede saber que tiene que instanciar las clases, pero solo puede saber

acerca de clases abstractas, que no puede crear una instancia, Por lo tanto, la clase de

aplicaciones solo puede saber cuando tiene que instanciar un nuevo objeto de una clase, no el

tipo de la subclase a crear.

Intención

Definir una interfaz para crear objetos de tipo genérico permitiendo a las subclases decidir qué

tipo de objetos concreto crear.

Motivación

Sea un framework para la construcción de editores de documentos de distintos tipos.

Se nos presenta el dilema de que el framework es quien sabe, a través de su clase Aplicación,

cuándo se debe crear un nuevo documento, pero no sabe qué documento crear (sólo conoce a

la clase abstracta o interfaz)

La solución de este dilema es encapsular el conocimiento de cuál es la subclase concreta del

documento a crear y mover ese conocimiento fuera del framework.

Aplicabilidad

Una clase no puede anticipar el tipo concreto de objetos que debe crear

Una clase quiere que sus subclases especifiquen el tipo de objetos a crear

Estructura

Page 16: Principios básicos de la usabilidad pdf

Participantes

Product: define la interfaz de los objetos que el método factory va a crear.

ConcreteProduct: implementa la interfaz Product.

Creator: Declara el FactoryMethod(), el cual retorna un objeto del tipo Product(). Creator

también puede definir una implementación por defecto del FactoryMethod() y retornar un

objeto por defecto.

ConcreteCreator: Redefine el FactoryMethod() que retorna una instancia ConcreteProduct

Patrones relacionados

Template Method El patrón Factory Method es a menudo utilizado con el patrón Template

Method. Prototype: El patrón Prototype proporciona un modo alternativo para un objeto de

trabajar con otros objetos sin conocer los detalles de su construcción. El patrón Prototype

específica la clase de objetos a crear usando una instancia prototípica, y creando los objetos

mediante una copia de este prototipo.

Consecuencias

Seguir las convenciones de nombres para ayudar a otros desarrolladores a reconocer la

estructura del código.

Factory method puede ser parametrizado.

Ocultar clases concretas del cliente.

Una familia de objetos tiene que ser separados por el uso compartido de la interfaz.

Una desventaja de los Factory Methods es que los clientes deberán hacer subclases de la clase

creadora solo para crear un ConcreteProduct objeto particular.

Implementación

Convenios de nominación. Se suele usar el prefijo create.

La factoría se suele implementar como un Singleton.

El método fábrica parametrizado(y en menor medida el no parametrizado) protege de la

variación del tipo de producto concreto.

Diseñar una fábrica concreta que permita crear productos cuya definición del tipo no se conoce

en tiempo de compilación.

El objetivo es ahorrar recursos con la creación de objetos, la manera mas eficiente de tener los

objetos sin crearlos de nuevo es clonándolos.

Intención

Page 17: Principios básicos de la usabilidad pdf

Especifica los tipos de objetos a crear utilizando una instancia prototipo, y crea nuevos objetos

copiando esta instancia.

Motivación

En ciertos escenarios es preciso abstraer la lógica que decide que tipos de objetos utilizará una

aplicación, de la lógica que luego usarán esos objetos en su ejecución. Los motivos de esta

separación pueden ser variados, por ejemplo, puede ser que la aplicación deba basarse en

alguna configuración o parámetro en tiempo de ejecución para decidir el tipo de objetos que se

debe crear.

Aplicabilidad

Un sistema debe ser capaz de crear objetos sin conocer su clase exacta, como son creados, o que

datos representan.

Las clases serán instanciadas sin ser conocidas por el sistema hasta el tiempo de ejecución.

Los siguientes métodos para la creación de una gran variedad de objetos son indeseables:

Las clases que inicializan la creación de objetos crean directamente los objetos. Esto hace que

ellos sean conscientes y dependientes de un gran número de otras clases.

Las clases que inicializan la creación de objetos crean los objetos indirectamente a través de

una clase factory method. Un factory method que es capaz de crear una gran variedad de objetos

puede ser muy grande y difícil de mantener.

Las clases que inicializan la creación de objetos crean los objetos indirectamente a través de

una clase abstracta factory. Para que un abstracta

factory sea capaz de crear una gran variedad de objetos debe tener una gran variedad de clases

factory concretas en una jerarquía semejante a las clases que deben ser instanciadas.

Los objetos diferentes que un sistema debe crear deben ser instancias de la misma clase que

contienen diferentes estados de información o datos.

Estructura

Participantes

Cliente

La clase Cliente crea nuevos objetos pidiendo al prototipo que se clone.

Prototype

Declara la interface del objeto que se clona. Suele ser una clase abstracta.

PrototypeConcreto

Las clases en este papel implementan una operación por medio de la clonación de sí mismo.

Colaboraciones

Un cliente pide a un prototipo que se clone.

Consecuencias

Page 18: Principios básicos de la usabilidad pdf

Un programa puede dinámicamente añadir y borrar objetos prototipo en tiempo de ejecución.

Esta es una ventaja que no ofrece ninguno de los otros patrones de creación.

Esconde los nombres de los productos específicos al cliente.

El objeto cliente puede también ser capaz de crear nuevos objetos de tipos prototipo.

Se pueden especificar nuevos objetos prototipo variando los existentes.

La clase Cliente es independiente de las clases exactas de los objetos prototipo que utiliza.

También, la clase Cliente no necesita conocer los detalles de cómo construir los objetos

prototipo.

Los objetos de prototipo concretos implementan el interface Prototype , de esta forma el patrón

Prototype se asegura de que los objetos prototipo proporcionan un conjunto consistente de

métodos para que los objetos clientes los utilicen.

Se puede configurar una aplicación cargando clases dinámicamente.

No hay necesidad de organizar los objetos prototipos en ningún orden de jerarquía de clases.

Las subclases son reducidas.

Patrones relacionados

Composite

El patrón Prototype es utilizado a menudo con el patrón Composite.

Abstract Factory

El patrón Abstract Factory puede ser una buena alternativa al patrón

Prototype donde los cambios dinámicos que el patrón Prototype permite para los objetos

prototipo no son necesarios. Pueden competir en su objetivo, pero también pueden colaborar

entre sí.

Facade

La clase cliente normalmente actúa comúnmente como un facade que separa

las otras clases que participan en el patrón Prototype del resto del programa.

Factory Method

El patrón Factory Method puede ser una alternativa al patrón

Prototype cuando la paleta de objetos prototipo nunca contiene más de un objeto.

Decorator

El patrón Prototype es utilizado a menudo con el patrón Decorator.

Implementación

Todas las clases en Java heredan un método de la clase Object llamado clone. Un método clone

de un objeto retorna una copia de ese objeto. Esto solamente se hace para instancias de clases

que dan permiso para ser clonadas. Una clase da permiso para que su instancia sea clonada si,

y solo si, ella implementa el interface Cloneable.

Si va a variar el número de prototipos se puede utilizar un administrador de prototipos.

Cómo implementar la operación clone de los objetos prototipo es otra importante característica

de la implementación. Hay dos estrategias básicas para implementar la operación clone:

1. Copia superficial significa que las variables de los objetos clonados contienen los mismos

valores que las variables del objeto original y que todas las referencias al objeto son a los

mismos objetos. En otras palabras, la copia superficial copia solamente el objeto que será

clonado, no los objetos a los que se refiere.

Page 19: Principios básicos de la usabilidad pdf

2. Copia profunda significa que las variables de los objetos clonados contienen los mismos

valores que las variables del objeto original, excepto que estas variables que se refieren a

objetos realizan copias de los objetos referenciados por el objeto original. En otras palabras, la

copia profunda copia el objeto que será clonado y los objetos a los que se referencia.

Implementar la copia profunda puede ser delicado.

Necesitarás decidir si quieres hacer copia profunda o superficial de los objetos copiados

indirectamente. También necesitarás ser cuidadoso con el manejo de las referencias circulares.

La copia superficial es más fácil de implementar porque todas las clases heredan un método

clone de la clase Object que hace esto. Sin embargo, a menos que una clase de objetos

implemente el interface Cloneable, el método clone rechazará trabajar. Si todos los objetos

prototipo que tu programes utilizarán clonarse a sí mismos por copia superficial, puedes

ahorrar tiempo declarando un interface Prototype que extienda el interface Cloneable. De esta

forma todas las clases que implementen el interface Prototype también implementarán el

interface Cloneable.

Este es un patrón que garantiza que una clase solo tenga una única instancia, y provee un punto

de acceso global a esta, haciendo así que todos los objetos utilicen una instancia de la clase,

utilicen la misma instancia.

En las aplicaciones a veces se hace necesario acceder a un objeto único, lo primero que se piensa

es, en que se necesita una variable global, pero no asegura que no podamos instanciar más de

una vez un objeto de esa clase. La solución es hacer que la clase sea la responsable de controlar

la existencia de una única instancia.

Intención

Garantiza que una clase sólo tenga una instancia y proporciona un punto de acceso global a ella.

Motivación

¿Cómo aseguro que una clase tenga solamente una instancia y que la instancia sea fácilmente

accesible? .Una variable global hace un objeto accesible, pero no puede esperar usted de

instanciar objetos múltiples. Una solución es hacer que la clase misma sea responsable de

garantizar que sea instanciada una única vez. La clase puede asegurar que ninguna otra

instancia puede ser creada (Interceptando los pedidos de crear nuevos objetos), y puede

proveer una manera hacerlo/serlo acceda al ejemplo. Éste es el patrón Singleton.

Aplicabilidad

Deba haber exactamente una instancia de una clase y ésta deba ser accesible a los clientes desde

un punto de acceso conocido.

La única instancia debería ser extensible mediante herencia y los clientes deberían ser capaces

de utilizar una instancia extendida sin modificar su código.

Estructura

Page 20: Principios básicos de la usabilidad pdf

¿Como se crea la clase?

El constructor de la clase debe ser privado o protegido. No puede ser público.

Para almacenar nuestra instancia debemos crear un atributo que sea estático y privado. No

puede ser protegido, ni público.

Hacemos un método estático de clase para crear el punto global de acceso a nuestra única

instancia. Este método debe retornar la instancia única.

Participantes

Define una operación Instancia que permite que los clientes accedan a su única instancia.

Instancia es una operación de clase.

Puede ser responsable de crear su única instancia.

Patrones relacionados

Puedes utilizar el patrón Singleton con muchos otros patrones. En particular, el patrón es

utilizado con los patrones Abstract Factory, Builder, y Prototype.

El patrón Singleton tiene alguna similitud con el patrón Cache Management.

Consecuencias

Existe exactamente una instancia de una clase Singleton.

Otras clases que quieran una referencia a la única instancia de la clase Singleton conseguirán

esa instancia llamando al método static getInstancia de la clase. Controla el acceso a la única

instancia.

Tener subclases de una clase Singleton es complicado y resultan clases imperfectamente

encapsuladas. Para hacer subclases de una clase Singleton, deberías tener un constructor que

no sea privado. También, si quieres definir una subclase de una clase Singleton que sea también

Singleton, querrás que la subclase sobrescriba el método getInstancia de la clase Singleton. Esto

no será posible, ya que métodos como getInstancia deben ser static. Java no permite

sobrescribir los métodos static.

Implementacion

Para forzar el carácter de una clase Singleton, debes codificar la clase de tal forma que

prevengas que otras clases creen directamente instancias de la clase. El modo de realizarlo es

declarar todos los constructores de la clase privados o protegidos. Tener cuidado de declarar al

menos un constructor privado. Si una clase no declara ningún constructor, entonces un

constructor público es automáticamente generado por ella.

Una variación común del patrón Singleton ocurre en situaciones donde la instancia de un

Singleton podría no ser necesaria. En estas situaciones, puedes posponer la creación de la

Instancia hasta la primera llamada a getInstancia.

Otra variación sobre el patrón Singleton desciende del hecho de que la política de Instanciación

Page 21: Principios básicos de la usabilidad pdf

de una clase está encapsulada en el método de la clase getInstancia. Debido a esto, es posible

variar la política de creación. Una posible política es tener el método

getInstancia que retorne alternativamente una de las dos intancias o crear periódicamente una

nueva instancia para ser retornada por getInstancia. Es decir se puede permitir un número

variable de instancias.

PATRONES DE COMPORTAMIENTO

Los patrones de diseño son el esqueleto de las soluciones a problemas comunes en el

desarrollo de software.”

En otras palabras, brindan una solución ya probada y documentada a problemas de desarrollo

de software que están sujetos a contextos similares. Debemos tener presente los siguientes

elementos de un patrón: su nombre, el problema (cuando aplicar un patrón), la solución

(descripción abstracta del problema) y las consecuencias (costos y beneficios).

Los patrones de diseño pretenden:

· Proporcionar catálogos de elementos reusables en el diseño de sistemas software.

· Evitar la reiteración en la búsqueda de soluciones a problemas ya conocidos y

solucionados anteriormente.

· Formalizar un vocabulario común entre diseñadores.

· Estandarizar el modo en que se realiza el diseño.

· Facilitar el aprendizaje de las nuevas generaciones de diseñadores condensando

conocimiento ya existente.

Asimismo, no pretenden:

· Imponer ciertas alternativas de diseño frente a otras.

· Eliminar la creatividad inherente al proceso de diseño.

Page 22: Principios básicos de la usabilidad pdf

· No es obligatorio utilizar los patrones, solo es aconsejable en el caso de tener el mismo

problema o similar que soluciona el patrón, siempre teniendo en cuenta que en un caso

particular puede no ser aplicable. "Abusar o forzar el uso de los patrones puede ser un error".

Categorías de patrones

· Según la escala o nivel de abstracción:

· Patrones de arquitectura: Aquéllos que expresan un esquema organizativo estructural

fundamental para sistemas de software.

· Patrones de diseño: Aquéllos que expresan esquemas para definir estructuras de diseño

(o sus relaciones) con las que construir sistemas de software.

· Dialectos: Patrones de bajo nivel específicos para un lenguaje de programación o

entorno concreto.

Estructuras o plantillas de patrones

Para describir un patrón se usan plantillas más o menos estandarizadas, de forma que se

expresen uniformemente y puedan constituir efectivamente un medio de comunicación

uniforme entre diseñadores. Varios autores eminentes en esta área han propuesto plantillas

ligeramente distintas, si bien la mayoría definen los mismos conceptos básicos.

La plantilla más común es la utilizada precisamente por el GoF y consta de los siguientes

apartados:

· Nombre del patrón: nombre estándar del patrón por el cual será reconocido en

la comunidad (normalmente se expresan en inglés).

· Clasificación del patrón: creacional, estructural o de comportamiento.

· Intención: ¿Qué problema pretende resolver el patrón?

· También conocido como: Otros nombres de uso común para el patrón.

· Motivación: Escenario de ejemplo para la aplicación del patrón.

· Aplicabilidad: Usos comunes y criterios de aplicabilidad del patrón.

· Estructura: Diagramas de clases oportunos para describir las clases que intervienen en

el patrón.

· Participantes: Enumeración y descripción de las entidades abstractas (y sus roles) que

participan en el patrón.

· Colaboraciones: Explicación de las interrelaciones que se dan entre los participantes.

· Consecuencias: Consecuencias positivas y negativas en el diseño derivadas de la

aplicación del patrón.

· Implementación: Técnicas o comentarios oportunos de cara a la implementación del

patrón.

Page 23: Principios básicos de la usabilidad pdf

· Código de ejemplo: Código fuente ejemplo de implementación del patrón.

· Usos conocidos: Ejemplos de sistemas reales que usan el patrón.

· Patrones relacionados: Referencias cruzadas con otros patrones.

Características:

· Las plantillas son de bajo costo.

· Se utililizan en diferentes tipos de aplicaciones: web, escritorio, app móviles.

· El código es reutilizable; comprada la plantilla, se adquiere la propiedad intelectual de la

misma.

Patrones orientados a objetos

(Análisis y diseño a objetos)

Tareas del patrón:

· Identificación de casos de uso.

· Definición del modelo conceptual.

· Especificación de diagrama de servicio.

· Definición de clases.

Identificación de casos de uso

Definición: el caso de uso describe una funcionalidad parcial del sistema que se desarrolla

Notación: Diagrama de casos de uso.

Page 24: Principios básicos de la usabilidad pdf

Modelo conceptual

Abarca las abstracciones del mundo real en términos de claves y objetos.

El Modelo Conceptual ilustra:

• Conceptos (Objetos) en el dominio del problema.

• Es el instrumento (artefacto) más importante de

Crear en el AOO.

• Es la representación de cosas del mundo real y

NO de componentes de software. En él NO se

Definen operaciones.

• Puede representarse mediante un diagrama de

Estructura estático (notación UML).

Características

El modelo conceptual se convierte en el insumo básico del diagrama de clases.

Diagrama de secuencia

Describe espacial y temporal el flujo normal de eventos entre los diferentes conceptos

Page 25: Principios básicos de la usabilidad pdf

presentes en el sistema.

Definición de clases:

Se especifican las clases presentes en el sistema y se parametrizan (métodos y atributos

para cada clase).

Patrones de diseño vista-control

Ofrece un número mayor de ventajas con respecto al patrón orientado a objetos.

Tiene tres componentes (capas de desarrollo)

Capa vista: en términos de la interfaz de usuario.

Capa lógica: se almacena e implementan los objetos de la aplicacion, tiene dos presentaciones

Capa conceptos

Ejemplo: Usuario y contraseña

Capa conceptos

Ejemplo: Nombre del usuario y comparar contraseña .

3-Capa de almacenamiento: gestión de archivos, Bases de datos.

Ejemplo: gestión de archivos con los nombres de los usuarios El patrón vista-control sugiere

un diseño TOP-DOWN con una importancia centrada en la interfaz de usuario la cual debe ser

obtenida a partir de los requisitos del producto software.

Page 26: Principios básicos de la usabilidad pdf

Requisitos

Es una necesidad que tiene un usuario o cliente de un producto software

Necesidad se traduce en términos de funciones.

Características:

Todos los requisitos no deben dar posibilidad a la ambigüedad

Los requisitos deben permitir entender el domino de la aplicaron

Los requisitos se deben obtener del cliente o usuario

Diagrama de casos de uso

Actor: fuente o sumidero "Externo" al sistema que interactúa con el desencadenado una serie

de eventos interrelacionados.

Atributo del sistema: Son requisitos no funcionales, que son necesidades propias del producto

software.

Aplicación

Medio físico (Hardware) memoria, etc.

Tolerancia a fallos.

Metáfora de la interfaz: Describe el estándar utilizado para desarrollar la interfaz.

Técnicas para levantar requisitos:

1-Entrevista.

Page 27: Principios básicos de la usabilidad pdf

2-JAD (Joint applications Development).

3-Sketch ans story board.

4-Concept Moping.

5-Brainstorming (lluvia de ideas).

6-Layout.

7-Use case.

8-Patrones.

9-Chek List.

Patrón Arquitectónico de capas

La arquitectura del SI es una descripción de los

Subsistemas y componentes, y las relaciones entre ellos.

· Determina:

· La organización estructural del SI.

· La selección de los elementos estructurales.

· Las interfaces entre ellos.

· El comportamiento de los componentes.

· Un componente es una parte física y reemplazable de un sistema.

Catálogo parcial de patrones arquitectónicos

· Llamada y retorno

· estilo más usado en los grandes SI

· Descomposición modular jerárquica

· Orientado a objetos

· En capas

· Centrado en los datos

· permite la manipulación compartida de datos

· Repositorio

· Pizarra

· Flujo de datos

· permite la transformación incremental de los datos

· Batch secuencial

Page 28: Principios básicos de la usabilidad pdf

· Tubos y filtros

· Modelo – vista – controlador

· para sistemas interactivos

Patroness Grasp (General reponsability assignament software pattern)

En diseño orientado a objetos, GRASP son patrones generales de software para asignación de

responsabilidades, es el acrónimo de "General Responsibility Assignment Software Patterns" .

Aunque se considera que más que patrones propiamente dichos, son una serie de "buenas

prácticas" de aplicación recomendable en el diseño de software.

Patrones de software para asignar responsabilidades

Función:

Definir en las clases de análisis.

1-La clase con mayor jerarquía para implementar en ella los métodos.

Clase patrón

2-Asignar responsabilidades a las clases.

Elementos para definir un patrón Grasp.

Diagrama de paquetes

Diagrama de secuencia

Diagrama de paquetes

Paquete: Agrupación de casos de uso con aspectos similares en su funcionalidad .

ejemplo:

Page 30: Principios básicos de la usabilidad pdf

El diagrama de secuencia es un tipo de diagrama usado para modelar interacción entre objetos

en un sistema según UML. En inglés se pueden encontrar como "sequence diagram", "event-

trace diagrams", "event scenarios" o "timing diagrams"

Patrones Grasp

· Patrón experto.

· Patrón creador.

· Patrón bajo acoplamiento.

· Patrón alta cohesión.

· Patrón controlador.

Patrón experto

Determina en un modelo conceptual (Diagrama de clases) la clase que posee la mayor jerarquía

para asignarle una responsabilidad "La responsabilidad que se quiera evaluar y debe ser

implementado por un método"

Ventajas del patrón experto

Garantizar el encapsulamiento de la información

Facilita el bajo acoplamiento en las aplicaciones

Patrón creador

Se utiliza cuando se quiere a partir de una clase con alta jerarquía obtener clases descendiente

o instancias a partir de las clases obtenidas.

Tipos de clases:

Clases abstractas (1)

Clases concretas (2)

(1) son las clases que dan origen a otras solamente.

Page 31: Principios básicos de la usabilidad pdf

(2) son las clases a partir de las cuales se pueden obtener instancias.

El patrón creador define dos estructuras dentro de la jerarquía

Estructura AKO

Estructura APO

AKO(A King of): una clase de

APO(A Punto of): una parte de

Patron bajo Acoplamiento

Es la idea de tener las clases lo menos ligadas entre sí que se pueda. De tal forma que en caso

de producirse una modificación en alguna de ellas, se tenga la mínima repercusión posible en

el resto de clases, potenciando la reutilización, y disminuyendo la dependencia entre las clases

1. Acoplamiento de Contenido: Cuando un módulo referencia directamente el contenido de otro

módulo. (En lenguajes de alto nivel es muy raro)

2. Acoplamiento Común: Cuando dos módulos acceden (y afectan) a un mismo valor global.

3. Acoplamiento de Control: Cuando un módulo le envía a otro un elemento de control que

determina la lógica de ejecución del mismo.

Patron alto cohesión

Nos dice que la información que almacena una clase debe de ser coherente y debe estar (en la

medida de lo posible) relacionada con la clase.

1. Cohesión Coincidente: El módulo realiza múltiples tareas, sin ninguna relación entre ellas.

2. Cohesión Lógica: El módulo realiza múltiples tareas relacionadas, pero, en tiempo de

ejecución, sólo una de ellas será llevada a cabo.

3. Cohesión Temporal: Las tareas llevadas a cabo por un módulo tienen, como única relación el

deber ser ejecutadas “al mismo tiempo”.

4. Cohesión de Procedimiento: La única relación que guardan las tareas de un módulo es que

corresponden a una secuencia de pasos propia del “producto”.

5. Cohesión de Comunicación: Las tareas corresponden a una secuencia de pasos propia del

“producto” y todas afectan a los mismos datos.

6. Cohesión de Información: Las tareas llevadas a cabo por un módulo tienen su propio punto

de arranque, su codificación independiente y trabajan sobre los mismos datos. El ejemplo

típico: OBJETOS

7. Cohesión Funcional: Cuando el módulo ejecuta una y sólo una tarea, teniendo un único

objetivo a cumplir, se dice que tiene Cohesividad Funcional.

Page 32: Principios básicos de la usabilidad pdf

Patrón controlador

Es el encargado de definir las estructuras para los patrones experto y creador .

Experto: Diagrama de secuencia.

Creadas: Jerarquía: AKO, APO.

Patrones Gof

Gang-of-Four (“pandilla de los cuatro”) Descritos en el libro Design Patterns(Gama1995)

definieron un catálogo con 23 Patrones básicos. Los patrones de diseño (design patterns) son

la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y

otros ámbitos referentes al diseño de interacción o interfaces.

Un patrón de diseño es una solución a un problema de diseño. Para que una solución sea

considerada un patrón debe poseer ciertas características. Una de ellas es que debe haber

comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es

que debe ser reusable, lo que significa que es aplicable a diferentes problemas de diseño en

distintas circunstancias.

Relación de principales patrones GoF (Gang Of Four)

Patrones creacionales

Abstract Factory (Fábrica abstracta): Permite trabajar con objetos de distintas familias de

manera que las familias no se mezclen entre sí y haciendo transparente el tipo de familia

concreta que se esté usando.

Builder (Constructor virtual): Abstrae el proceso de creación de un objeto complejo,

centralizando dicho proceso en un único punto.

Factory Method (Método de fabricación): Centraliza en una clase constructora la creación de

objetos de un subtipo de un tipo determinado, ocultando al usuario la casuística para elegir el

subtipo que crear.

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

Singleton (Instancia única): Garantiza la existencia de una única instancia para una clase y la

creación de un mecanismo de acceso global a dicha instancia.

Patrones estructurales

Adapter (Adaptador): Adapta una interfaz para que pueda ser utilizada por una clase que de

otro modo no podría utilizarla.

Bridge (Puente): Desacopla una abstracción de su implementación.

Page 33: Principios básicos de la usabilidad pdf

Composite (Objeto compuesto): Permite tratar objetos compuestos como si de un simple se

tratase.

Decorator (Envoltorio): Añade funcionalidad a una clase dinámicamente.

Facade (Fachada): Provee de una interfaz unificada simple para acceder a una interfaz o grupo

de interfaces de un subsistema.

Flyweight (Peso ligero): Reduce la redundancia cuando gran cantidad de objetos poseen

idéntica información.

Proxy: Mantiene un representante de un objeto.

Patrones de comportamiento

Chain of Responsibility (Cadena de responsabilidad): Permite establecer la línea que deben

llevar los mensajes para que los objetos realicen la tarea indicada.

Command (Orden): Encapsula una operación en un objeto, permitiendo ejecutar dicha

operación sin necesidad de conocer el contenido de la misma.

Interpreter (Intérprete): Dado un lenguaje, define una gramática para dicho lenguaje, así como

las herramientas necesarias para interpretarlo.

Iterator (Iterador): Permite realizar recorridos sobre objetos compuestos independientemente

de la implementación de estos.

Mediator (Mediador): Define un objeto que coordine la comunicación entre objetos de distintas

clases, pero que funcionan como un conjunto.

Memento (Recuerdo): Permite volver a estados anteriores del sistema.

Observer (Observador): Define una dependencia de uno-a-muchos entre objetos, de forma que

cuando un objeto cambie de estado se notifique y actualicen automáticamente todos los objetos

que dependen de él.

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

Strategy (Estrategia): Permite disponer de varios métodos para resolver un problema y elegir

cuál utilizar en tiempo de ejecución.

Template Method (Método plantilla): Define en una operación el esqueleto de un algoritmo,

delegando en las subclases algunos de sus pasos, esto permite que las subclases redefinan

ciertos pasos de un algoritmo sin cambiar su estructura.

Visitor (Visitante): Permite definir nuevas operaciones sobre una jerarquía de clases sin

modificar las clases sobre las que opera.

Page 34: Principios básicos de la usabilidad pdf

PATRONES ESTRUCTURALES

Adapta una interfaz para que pueda ser utilizada por una clase que de otro modo no podría

utilizarla.

Motivacion

Necesitamos reutilizar clases ajenas paranuestro sistema, pero aunque la funcionalidad de

estas clases es la que deseamos, la interfaz no es compatible. Si no podemos o no queremos

modificar las clases a reutilizar, necesitamos hacerlas compatibles con nuestro sistema.

Aplicabilidad

Se quiere utilizar una clase que llame a un método a través de una interface, pero quieres

utilizarlo con una clase que no implementa ese interface. Modificar esa clase que implementa

el interface no es una opción por un par de razones:

1. No tienes el código fuente de la clase.

2. La clase es una clase de propósito general, y es inapropiado para ella implementar un

interface par un propósito específico.

Se quiere determinar dinámicamente que métodos de otros objetos llama un objeto.

Se quiere realizarlo sin que el objeto llamado tenga conocimientos de la otra clase de objetos.

Estructura

Participantes

Target: Define la interfaz especifica del dominio en el que se quiere hacer uso de la clase que se

adapta.

Client: Utiliza objetos que implementan la interfaz definida por el target.

Adaptee: Presenta su interfaz original, que es la que se tiene que adaptar.

Adapter: Adapta la interfaz del objeto adaptado a la definida por el target.

Colaboraciones

Esta sección está compuesta por máximo seis (6) palabras o frases que describan los tópicos,

áreas o temas más importantes del trabajo. Deben estar ordenadas alfabéticamente. La

selección de palabras clave apropiadas permitirá la inclusión del artículo en índices

internacionales así como la ubicación rápida del artículo por parte de un lector interesado.

Consecuencias

El cliente y las clases Adaptee permanecen independientes unas de las otras.

El patrón Adapter introduce una in dirección adicional en un programa . Como cualquier otra

Page 35: Principios básicos de la usabilidad pdf

in dirección, contribuye a la dificultad implicada en la compresión del programa.

Se puede utilizar una clase Adapter para determinar cuales de los métodos de un objeto llama

otro objeto.

Adaptadores de clase y el objeto tienen diferentes ventajas y desventajas. A class adapter Una

clase adaptador

Adaptee se adapta al objetivo de la comisión a una clase concreta adaptador. Como

consecuencia de ello, una clase

adaptador no funciona cuando se quiere adaptar una clase y todas sus subclases.

Adaptador permite anular algunas de Adaptee el comportamiento, ya que el adaptador es una

subclase de Adaptee.

sólo introduce un objeto, y no puntero indirección adicional es necesaria para llegar a la

adaptee.

Un objeto adaptador

permite a un único adaptador de trabajar con muchas Adaptees-es decir, la Adaptee sí mismo y

todas sus subclases

(si procede). El adaptador también puede agregar funcionalidad a todos los Adaptees a la vez.

Adaptador se refieren a la subclase más que la propia Adaptee

Implementación

La implementación de una clase Adapter es más bien sencilla. Sin embargo, una cuestión que

deberías considerar cuando implementes el patrón Adapter es como los objetos adapter

conocen que instancia de la clase Adaptee llamar. Hay dos métodos:

1. Pasar una referencia a los objetos cliente como parámetro a los costructores de los objetos

adapter o a uno de sus métodos. Esto permite al objeto adapter ser utilizado con cualquier

instancia o posiblemente muchas instancias de la clase Adaptee.

Hacer la clase Adapter una clase interna de la clase Adaptee. Esto simplifica la asociación entre

el objeto adapter y el objeto adaptee haciendolo automático.

También hace la asociación inflexible.

Código ejemplo

public interface ListModel {

int getSize();

Object getElementAt(int index);

}

public interface TableModel {

public int getRowCount();

// obtener número de filas

public int getColumnCount();

// obtener número de columnas

public Object getValueAt(int fil, int col);

// retorna valor del elemento fila fil y columna col

public String getColumnName(int col);

// retorna nombre de la columna col

Page 36: Principios básicos de la usabilidad pdf

}

Usos conocidos

El API de Java no incluye ningún objeto adapter público que este listo para utilizar. Incluye

clases tales como java.awt.event.WindowAdapter que pretenden ser heredadas más que

utilizarse directamente. La idea es que hay algunos interfaces escuchadores de eventos, tales

como WindowListener, que declaran varios métodos. En muchos casos no todos los métodos

necesitan ser implementados. El interface WindowListener declara ocho métodos que son

llamados para proporcionar notificación sobre los ocho tipos diferentes de eventos de la

ventana. A menudo uno o dos de estos tipos de eventos son de interés. Los métodos que

corresponden a los eventos que no son de interés normalmente están dando implementaciones

de no hacer nada. La clase WindowAdapter implementa el interface WindowListener e

implementa los ocho métodos con implementaciones de no hacer nada. Una clase Adapter que

hereda la clase WindowAdapter necesita implementar solamente los métodos que

corresponden a los eventos que son de interés. Hereda las implementaciones de no hacer nada

para el resto.

Patrones relacionados

Facade

La clase Adapter proporciona un objeto que actúa como un intermediario para llamar a los

métodos entre los objetos cliente y uno de los otros objetos que no conocen a los objetos cliente.

El patrón Facade proporciona un objeto que actúa como un intermediario para llamar a los

métodos entre los objetos cliente y múltiples objetos que no conocen a los objetos cliente.

Iterator

El patrón Iterator es un versión especializada del patrón Adapter para acceder secuencialmente

al contenido de una colección de objetos.

Proxy

El patrón Proxy, como el patrón Adapter, utiliza un objeto que es un sustituto por otro objeto.

Sin embargo, un objeto proxy tiene el mismo interface que el objeto por el que es sustituido.

Strategy

El patrón Strategy es estructuralmente similar al patrón Adapter. La diferencia esta en el

objetivo. El patrón Adapter permite a un objeto cliente exportar su función deseada

originalmente para llamar al método de los objetos que implementan un interface particular. El

patrón Strategy proporciona objetos que implementan un interface particular con el propósito

de alterar o determinar el comportamiento de un objeto cliente.

Bridge

Intención

desacopla una abstracción de su implementación para que puedan variar independientemente.

Motivación

Cuando queremos que un objeto cambie su comportamiento, según cambia su estado, se

presenta el problema de la complejidad de código.

Page 37: Principios básicos de la usabilidad pdf

Aplicabilidad

Se usa el patrón Bridge cuando:

Se desea evitar un enlace permanente entre la abstracción y su implementación. Esto puede ser

debido a que la implementación debe ser seleccionada o cambiada en tiempo de ejecución.

Tanto las abstracciones como sus implementaciones deben ser extensibles por medio de

subclases. En este caso, el patrón Bridge permite combinar abstracciones e implementaciones

diferentes y extenderlas independientemente.

Cambios en la implementación de una abstracción no deben impactar en los clientes, es decir,

su código no debe tener que ser recompilado.

(En C++) Se desea esconder la implementación de una abstracción completamente a los

clientes. En C++, la representación de una clase es visible en la interface de la clase.

Se desea compartir una implementación entre múltiples objetos (quizá usando contadores), y

este hecho debe ser escondido a los clientes.

Estructura

Participantes Abstraction define una interface abstracta. Mantiene una referencia a un objeto de tipo

Implementor.

RefinedAbstraction extiende la interface definida por Abstraction

Implementor define la interface para la implementación de clases. Esta interface no se tiene que

corresponder exactamente con la interface de Abstraction; de hecho, las dos interfaces pueden

ser bastante diferente. Típicamente la interface Implementor provee sólo operaciones

primitivas, y Abstraction define operaciones de alto nivel basadas en estas primitivas.

ConcreteImplementor implementa la interface de Implementor y define su implementación

concreta.

Colaboraciones

Abstraction emite los pedidos de los clientes a su objeto Implementor.

Consecuencias

Un objeto puede cambiar su implementación en tiempo de ejecución.

Cambios en la implementación no requerirán compilar de nuevo la clase Abstracción y sus

clientes.

Se mejora la extensibilidad.

Se ocultan detalles de implementación a los clientes.

Implementación

Sólo un Implementor: en situaciones donde existe sólo una implementación, crear una clase

Implementor abstracta no es necesario. Esto es un caso especial del patrón; hay una relación

Page 38: Principios básicos de la usabilidad pdf

uno-a-uno entre Abstraction e Implementor. Sin embargo, esta separación es aún muy útil

cuando un cambio en la implementación de una clase no debe afectar a sus clientes existente,

es decir, ellos no deben ser recompilados, sólo relinkeados. En C++, la interface de la clase

Implementor puede ser definida en un archivo header privado el cual no es proveído a los

clientes. Esto permite esconder una implementación de una clase completamente de sus

clientes.

Creando el objeto Implementor adecuado: ¿Cómo, cuándo y dónde que clase Implementor

instanciar cuando hay más de una?Si Abstraction conoce todas las clases ConcreteImplementor

puede instanciar una de ellas en su constructor; puede decidir cuál instanciar dependiendo de

los parámetros del constructor.

Otra aproximación es elegir una implementación inicial por defecto y cambiarla después acorde

al uso. También es posible delegar la decisión a otro objeto en conjunto.

Compartiendo implementadores: el estilo Handle/Body en C++ puede ser usado para compartir

implementaciones de muchos objetos. Body almacena una cuenta de referencia que la clase

Handle incrementa y decrementa. Usando herencia múltiple. Se puede usar herencia múltiple

en C++ para asociar una interfaz con su implementación.

Creamos una clase Abstracción padre que sea abstracta, además de abstracciones concretas

mediante clases que heredan de ella. Por otro lado se tienen las clases que implementan la

funcionalidad con una estructura similar: una clase ImplementaciónAbstracta padre, y todas las

clases hijas necesarias que implementan la funcionalidad de todas las maneras necesarias. La

relación se da entre la clase abstracta Abstracción y la clase abstracta Implementación,

delegando la primera la implementación en la segunda, que a su vez la delega en las

implementaciones concretas.

Intención

Componer objetos en estructuras de árbol para representar jerarquías parte-todo.

Composite permite a los clientes tratar cada uno de los objetos y composiciones de objetos de

manera uniforme.

Motivación

El problema que trata

Para constituir diagramas complejos desde componentes

simples en casos como un editor de dibujos, diseñador de

circuitos

Los objetos primitivos y los contenedores de ellos están en

diferentes maneras, aunque los clientes tratan ambos en la

misma manera.

Aplicabilidad

Cuando necesitamos representar la relación parte-todo

Cuando queramos que los clientes olviden la diferencia entre

las composiciones de objetos y los objetos individuales

Page 39: Principios básicos de la usabilidad pdf

Estructura

Participantes

Componente

Declara la interfaz para los clientes puedan acceder a lo objetos en la composición

Implementa comportamientos por defectos para todas las clases

Hoja

Representa los objetos hoja en la composición. No tienen hijos.

Define el comportamiento de los objetos primitivos en la composición

Compuesto

Define el comportamiento para los componentes que tienen

hijos

.

Almacena los componentes hijos

Implementa operaciones relacionadas a los hijos en la interfaz

de Componente

. Cliente

Manipula los objetos en la composición a través de la interfaz

de la clase Componente

.

Colaboraciones

Existen colaboraciones entre el cliente y

Componente

El cliente utiliza la interfaz para interactuar

con los objetos en la composición

Si el recibidor es una hoja: la petición se

trata directamente

Page 40: Principios básicos de la usabilidad pdf

Si el recibidor es un Compuesto: la petición

se pasa a sus hijos

Puede tener más operaciones extras

Consecuencias

Se define una jerarquía de clases con objetos

primitivos y compuestos

Simplifica las tareas del cliente. Puede tratar un

compuesto como un objeto primitivo

Facilita añadir nuevos componentes sin modificar

la estructura ni los códigos de clientes

Desventajas:

El diseño de programa puede ser demasiado

general

Difícil de restringir los componentes de un

compuesto.

Implementación

Temas para considerar en la implementación:

Referencias explícitas al padre

Es conveniente a tener la referencia al padre para simplificar el recorrido y administración

hacia arriba

Compartir componentes

Para ahorrar espacio de almacenamiento

Será difícil a compartir cuando el componente tiene un sólo

padre

La solución aparece en el patrón Flyweight

Maximizar la interfaz de Componente.

Es bueno a definir más operaciones posibles en la clase

Page 41: Principios básicos de la usabilidad pdf

Componente tanto para Compuesto como para Hoja

Definir operaciones por defectos en Componente y luego las

subclases puedan redefinirlas si son necesarias.

Dónde declarar las operaciones para administrar los hijos

Definir en la raíz (Componente): mejor transparencia peor

seguridad porque los clientes pueden hacer cosas raras

Definirlas en Compuesto: mejor seguridad pero pierde la

transparencia

Una solución: verificar en la interfaz si lo que pide es un

Compuesto o una hoja.

Código ejemplo

public abstract class Componente

{

protected String nombre;

public Componente (String nombre)

{

this.nombre = nombre;

}

abstract public void Agregar(Componente c);

abstract public void Remover(Componente c);

abstract public void Mostrar(int profundidad);

}

class Compuesto extends Componente

{

private ArrayList hijo = new ArrayList();

public Compuesto (String name)

{

super(name);

}

@Override

public void Agregar(Componente componente)

{

hijo.add(componente);

}

@Override

public void Remover(Componente componente)

{

hijo.remove(componente);

}

@Override

Page 42: Principios básicos de la usabilidad pdf

public void Mostrar(int profundidad)

{

System.out.println(nombre + " nivel: " + profundidad);

for (int i = 0; i < raiz =" new" comp =" new" l =" new" style="font-weight: bold;" size="4">Usos

conocidos

n Java:

· las clases java.awt.Component(Componente)

· java.awt.Container(Contenedor)

· java.awt.Panel(Contenedor concreto)

· java.awt.Button(Boton)

Patrones relacionados

Chain of Responsibility: para crear enlace entre la

clase componente y su padre

Decorator: se suelen utilizar con composite.

Normalmente tienen una clase pariente en comúm

Flyweight: nos permite compartir componentes, pero

sin referencias a su pariente

Iterator: se puede utilizar para recorrer los

compuestos

Visitor: puede localizar operaciones y

comportamientos sin distribuirlos entre las clases de

Compuesto y Hoja

Decorator

Intención

Fija responsabilidades adicionales a un objeto dinámicamente. Decoreirtors provee una

alternativa flexible a las subclasses para extender la funcionalidad.

Motivación

A veces se desea adicionar responsabilidades a un objeto pero no a toda la clase. Las

responsabilidades se pueden adicionar por medio de los mecanismos de Herencia, pero este

mecanismo no es flexible porque la responsabilidad es adicionada estáticamente. La solución

flexible es la de rodear el objeto con otro objeto que es el que adiciona la nueva responsabilidad.

Este nuevo objeto es el Decorator.

Aplicabilidad

Page 43: Principios básicos de la usabilidad pdf

Añadir objetos individuales de forma dinámica y transparente

Responsabilidades de un objeto pueden ser retiradas

Cuando la extensión mediante la herencia no es viable

Hay una necesidad de extender la funcionalidad de una clase, pero no hay razones para

extenderlo a través de la herencia.

Hay la necesidad de extender dinámicamente la funcionalidad de un objeto y quizás quitar la

funcionalidad extendida.

Estructura

Participantes

Component

Define la interface de los objetos a los que se les pueden adicionar responsabilidades

dinámicamente.

ConcreteComponent

Define el objeto al que se le puede adicionar una responsabilidad.

Decorator

Mantiene una referencia al objeto Component y define una interface de acuerdo con la interface

de Component.

ConcreteDecorator

Adiciona la responsabilidad al Component.

Colaboraciones

Decorator envía las solicitudes a su componente de objeto. Opcionalmente puede realizar

operaciones adicionales antes y después del envío de la solicitud.

Consecuencias

Ventajas

1.Es más flexible que la Herencia estática.

2.Permite que la adicion de nuevas responsabilidades (nuevas clases de Decorators)

independiente de las clases los Objetos que ellas extienden.

Desventajas

1.Un Decorator y su Component no son idénticos. Desde el punto de vista de la identidad de los

objetos, un DecoratorComponent no es identico al Component. Por esto no se puede confiar en en la identidad de los objetos cuando se usan Decorators

2.El patrón Decorator hace que hayan muchos objetos pequeños que son muy parecidos.

Implementación

El patrón Decorator soluciona este problema de una manera mucho más sencilla y extensible.

Page 44: Principios básicos de la usabilidad pdf

Se crea a partir de Ventana la subclase abstracta VentanaDecorator y, heredando de ella,

BordeDecorator y BotonDeAyudaDecorator. VentanaDecorator encapsula el comportamiento

de Ventana y utiliza composición recursiva para que sea posible añadir tantas "capas" de

Decorators como se desee. Podemos crear tantos Decorators como queramos heredando de

VentanaDecorator.

Proporcionar una interfaz unificada a un conjunto de interfaces en un subsistema. Fachada

define una interfaz de alto nivel que hace que el subsistema sea más fácil de usar.

Motivación

Minimizar la comunicación y las dependencias entre subsistemas

Aplicabilidad

El uso de este patrón esta recomendado para

Simplicar el uso y comprensión de una librería software.

Encapsular un interfaz de librería poco amigable en un interfaz más coherente o mejor

estructurado.

Centralizar las dependencias externas hacia la librería en uno o pocos puntos de entrada.

Estructura

Participantes

Fachada

subsistema o sabe que las clases son responsables de una solicitud.

delegados a las solicitudes de cliente subsistema objetos.

subsistema de clases implementar la funcionalidad del subsistema.

manejar el trabajo asignado por la Fachada objeto.

no tienen conocimiento de la fachada, es decir, no mantener las referencias a la misma.

Colaboraciones

Los clientes se comunican con el subsistema mediante el envío de peticiones a la fachada, que

reenvía a los subsistema objeto (s). A pesar de que el subsistema de objetos de realizar el

trabajo real, la fachada puede tener que hacer su propio trabajo de traducir su interfaz a las

interfaces del subsistema.

Los clientes que usan la fachada no tiene acceso a su subsistema de objetos directamente.

Consecuencias

la ventaja del patrón facade es que proporciona una interfaz mas simple para un sistema

Page 45: Principios básicos de la usabilidad pdf

complejo sin reducir las opciones proporcionadas por el conjunto del sistema. Esta interfaz

protege al cliente de la sobreabundancia de opciones.

El patrón Facade traduce las peticiones del cliente a los subsistema que pueden cumplir esas

peticiones. La mayor parte de las veces, una petición sera delegada en mas de un sistema. Como

el cliente Solo interactúa con el facade, el funcionamiento interno puede ser modificado,

mientras que el cliente del facade puede permanecer igual.

El patrón Facade fomenta el bajo acoplamiento entre el cliente y los subsistemas. También

puede ser utilizado para reducir el acoplamiento entre los subsistemas. Todos los subsistemas

pueden tener su propio Facade, y las otras partes del sistema pueden utilizar ese Facade para

comunicarse con el subsistema.

Implementación

Se puede reducir aún más el acoplamientohaciendo que la fachada sea una clase abstracta, de

forma que se pueda escogerentre distintas implementaciones del subsistema

Las clases Font y Graphics de las librerías estandar de Java que proporcionan la funcionalidad

básica para manipulación de fuentes y graficos aislando al usuario, en las operaciones más

comunes, de la complejidad subyacente. Otros ejemplos incluyen determinados interfaces de

librerías GIS o librerías matemáticas.

Patrones relacionados

Abstract factory : para simplificar el acceso a los distintos objetos creados por la fabrica , esta

también puede crear un objeto facade para todos ellos.

Mediator: los patrones mediator y facade son muy parecidos . La diferencia reside en la

intención y en la implementación. El patrón mediator ayuda a facilitar la comunicación entre

los componentes y sus comportamientos adicionales.

Singleton: el patrón facade utiliza el patrón Singleton para garantizar un punto de entrada único

y globalmente accesible para un subsistema.

Flyweight

Intención

Compartir estados para soportar un gran número de objetos pequeños aumentando la

eficiencia en espacio.

Motivación

El patrón flyweight describe como almacenar un gran número de objetos sin un gran coste.

Para conseguir esto se utilizan objetos que almacenan los estados compartidos y que pueden

ser usados por varios objetos simultáneamente.

Aplicabilidad

Se debe aplicar este patrón cuando se cumplen todas estas características:

Se utiliza un gran número de objetos

El coste de almacenamiento es alto debido a la cantidad de objetos

Page 46: Principios básicos de la usabilidad pdf

La mayoría de los estados de los objetos pueden ser creados como comunes.

Muchos objetos pueden ser reemplazados por unos pocos una vez que han sido borrados los

estados no comunes.

La aplicación no depende de la identidad de los objetos.

Estructura

Participantes

Flyweight

Declara una interfaz a través de la cual los flyweights pueden recibir y actuar sobre los estados

no compartidos.

ConcreteFlyweight

Implementa la interfaz Flyweight y almacena los estados compartidos, si los hay. Un objeto

ConcreteFlyweight debe ser compartible. Cualquier estado que almacene debe ser intrínseco;

es decir, debe ser independiente de su contexto.

UnsharedConcreteFlyweight

No todas las subclases de Flyweight tienen por qué ser compartidas. La interfaz Flyweight

permite que se comparta; no lo fuerza. Es común que los objetos de esta clase tengan hijos de

la clase ConcreteFlyweight en algún nivel de su estructura.

FlyweightFactory

Crea y gestiona los objetos flyweight.

Garantiza que los objetos flyweight se comparten de forma apropiada. Cuando un cliente

solicita un flyweight, el objeto de la clase FlyweightFactory proporciona una instancia existente,

o crea una.

Client

Contiene referencias a los flyweights.

Calcula o almacena los estados no compartidos de los flyweights.

Colaboraciones

Un objeto flyweight debe ser clasificado como compartido o no compartido. Los compartidos

se almacenan en el objeto ConcreteFlyweight; los no compartidos se almacenan o se calculan

en el objeto Cliente. Los clientes pasan este estado al objeto flyweight cuando invocan sus

operaciones.

Los clientes no deberían instanciar objetos de la clase ConcreteFlyweight directamente. Deben

obtenerlos exclusivamente del objeto FlyweightFactory para garantizar que son compartidos

apropiadamente.

Page 47: Principios básicos de la usabilidad pdf

Consecuencias

A primera vista , la ventaja que se obtiene es que se reduce el numero de objetos que hay que

gestionar. Esto puede ahorrar mucho espacio, tanto en memoria como en los dispositivos de

almacenamiento en caso de que sean objetos persistentes.

Se ahorra mas espacio aun si la información de contexto para los objetos Flyweight se calcula

en vez de tener la almacenada, sin embargo , esto nos lleva al inconveniente de este patrón: el

costo en tiempo de ejecución.

En lugar de almacenar muchos objetos, los clientes tienen que calcular el contexto y

proporcionar esa información a los objetos Flyweight. Los Flyweight utilizan esta información

para proporcionar funciones. Si se maneja menos objetos y se implementa correctamente, se

incrementa el rendimiento en tiempo de ejecución . Obsérvese que si hay, poca información de

contexto y el objeto Flyweight es grande , el ahorro es significativo.

Implementación

Crear una clase PelotaFlyweight, que contendrá la información común (radio y color) y otra

clase PelotaConcreta, que contendrá las coordenadas concretas de cada pelota y una referencia

a un objeto de tipo PelotaFlyweight.

Al crearse instancias de PelotaConcreta, se les deberá proveer de referencias a la instancia de

PelotaFlyweight adecuada a nuestras necesidades.

En este caso solamente tendríamos una instancia de PelotaFlyweight, puesto que hemos dicho

que todas nuestras pelotas tienen el mismo radio y color, pero pensando en un ejemplo en el

que tuviéramos varios grupos de pelotas, y dentro de cada uno de los cuales se compartieran el

radio y el color, se puede utilizar Flyweight conjuntamente con el patrón Factory, de tal modo

que este último, en el momento en que se le soliciten instancias de PelotaConcreta con

determinadas características (mismo radio y color que el solicitado), compruebe si ya existe un

PelotaFlyweight con ese radio y color, y devuelva esa referencia o, en caso de que no exista, la

cree y la registre. El patrón Factory se encargaría de gestionar los PelotaFlyweight existentes.

Proporcionar un sustituto o marcador de posición de otro objeto para controlar el acceso a ella.

Motivación

Diferir el coste de crear un objeto hasta que sea necesario usarlo: creación bajo demanda.

Un editor de documentos que incluyen objetos gráficos.

¿Cómo ocultamos que una imagen se creará cuando se necesite?: manejar el documento

requiere conocer información sobre la imagen.

Hay situaciones en las que un cliente no referencia o no puede referenciar a un objeto

directamente, pero necesita interactuar con él.

Un objeto proxy puede actuar como intermediario entre el objeto cliente y el objeto destino.

El objeto proxy tiene la misma interfaz como el objeto destino.

El objeto proxy mantiene una referencia al objeto destino y puede pasarle a él los mensajes

recibidos (delegación).

Retrasar la operación de una clonación de una tabla hasta conocer que es realmente necesaria.

Se desea clonar la tabla para evitar mantener un bloqueo un largo período de tiempo: operación

costosa. Se puede crear una clase que encapsule la tabla y sólo clone cuando sea necesario.

Mantenimiento de los servicios ante los fallos.

Materialización perezosa de tuplas en objetos.

Page 48: Principios básicos de la usabilidad pdf

Aplicabilidad

Siempre que hay necesidad de referenciar a un objeto mediante una referencia más rica que un

puntero o una referencia normal.

Situaciones comunes;

Proxy acceso remoto (acceso a un objeto en otro espacio de direcciones)

Proxy virtual (crea objetos grandes bajo demanda)

Proxy para protección (controlar acceso a un objeto)

Referencia inteligente (smart reference, proporciona operaciones adicionales)

Estructura

Participantes

Sujeto:

Define la interfaz común para el RealSubject y el Proxy, de modo que pueda usarse un Proxy en

cualquier sitio en el que se espere un RealSubject.

RealSubject:

Define el objeto real representado.

Proxy:

Mantiene una referencia que permite al Proxy acceder al objeto real.

Proporciona una interfaz idéntica a la del sujeto, de manera que un Proxy pueda ser sustituido

por el sujeto real.

Controla el acceso al sujeto real, y puede ser responsable de su creación y borrado.

Colaboraciones

Proxy reenvía las solicitudes de RealSubject en su caso, dependiendo del tipo de proxy.

Consecuencias

Introduce un nivel de indirección para:

Un proxy remoto oculta el hecho que objetos residen en diferentes espacios de direcciones.

Un proxy virtual tales como crear o copiar un objeto bajo demanda.

Un proxy para protección o las referencias inteligentes permiten realizar tareas de control

sobre los objetos accedidos.

Implementación

Tenemos un objeto padre Asunto del que heredan otros dos:AsuntoReal y Proxy, todos ellos tienen un método petición(). El cliente llamaría al método petición() de Asunto, el cual pasaría

la petición a Proxy, que a su vez instanciaría AsuntoReal y llamaría a su petición().

Page 49: Principios básicos de la usabilidad pdf

Esto nos permite controlar las peticiones a AsuntoReal mediante el Proxy, por ejemplo

instanciando AsuntoReal cuando sea necesario y eliminándolo cuando deje de serlo.

Sistemas:

Un servidor proxy es un equipo intermediario situado entre el sistema del usuario e Internet.

Puede utilizarse para registrar el uso de Internet y también para bloquear el acceso a una sede

Web.

El servidor de seguridad del servidor proxy bloquea algunas redes o páginas Web por diversas

razones. En consecuencia, es posible que no pueda descargar el entorno de ejecución de Java

(JRE) o ejecutar algunos applets de Java.

Servidores proxy: Funcionan como servidor de seguridad y como filtro de contenidos. Son un

mecanismo de seguridad implementado por el ISP o los administradores de la red en un

entorno de Intranet para desactivar el acceso o filtrar las solicitudes de contenido para ciertas

sedes Web consideradas ofensivas o dañinas para la red y los usuarios. Mejoran el rendimiento.

Guardan en la memoria caché las páginas Web a las que acceden los sistemas de la red durante

un cierto tiempo. Cuando un sistema solicita la misma página web, el servidor proxy utiliza la

información guardada en la memoria caché en lugar de recuperarla del proveedor de

contenidos. De esta forma, se accede con más rapidez a las páginas Web.