Está en la página 1de 11

PATRONES DE DISEO (DESIGN PATTERNS)

Un design pattern o patrn de diseo consiste en un diagrama de objetos que


forma una solucin a un problema conocido y frecuente. El diagrama de objetos est
constituido por un conjunto de objetos descritos por clases y las relaciones que enlazan
los objetos. Los patrones responden a problemas de diseo de aplicaciones en el marco
de la programacin orientada a objetos. Se trata de soluciones conocidas y probadas
cuyo diseo proviene de la experiencia de los programadores. Los patrones de diseo
estn basados en las buenas prcticas de la programacin orientada a objetos. (Laurent
Debrauwer)
Los patrones de diseo son la base para la bsqueda de soluciones a problemas
comunes en el desarrollo de software y otros mbitos referentes al diseo de interaccin o
interfaces. Un patrn de diseo resulta ser una solucin a un problema de diseo. Para
que una solucin sea considerada un patrn debe poseer ciertas caractersticas. Una de
ellas es que debe haber comprobado su efectividad resolviendo problemas similares en
ocasiones anteriores. Otra es que debe ser reutilizable, lo que significa que es aplicable a
diferentes problemas de diseo en distintas circunstancias. (Wikipedia)

HISTORIA
El trmino patrn fue utilizado por primera vez por el arquitecto Christopher
Alexande en el libro A Pattern Language: Towns, Buildings, Construction, donde defini
una serie de patrones arquitectnicos. Alexander define: Un patrn describe un problema
que ocurre a menudo, acompaado por un intento de solucin para el problema.
(Christopher Alexander, 1977).
En 1987, Ward Cunningham y Kent Beck estaban trabajando con Smaltalk,
diseando interfaces de usuario. Para ello, decidieron utilizar alguna de las ideas de
Alexander y desarrollaron un pequeo lenguaje de patrones que servira de gua a los
programadores de Smaltalk. A partir de estas idea escribieron el libro Using Pattern
Languajes for Object-Oriented Programs.
Desde 1990 a 1994, Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides
(Gang of four) realizaron un primer catlogo de patrones de diseo. En 1994 publicarn el
libro Design Patterns Elements of Reusable Object-Oriented Software que introduca el
termino de patrn de diseo en el desarrollo del software.
(http://codecriticon.com/introduccion-patrones-diseno/)

ELEMENTOS ESCENCIALES DE CADA PATRN


1. El nombre del patrn se utiliza para describir un problema de diseo, su solucin y
consecuencias en una o dos palabras. Nombrar un patrn incrementa
inmediatamente nuestro vocabulario de diseo. Esto nos permite diseos a un alto
nivel de abstraccin.

2. El problema describe cuando aplicar el patrn. Se explica el problema y su


contexto. Esto podra describir problemas de diseo especficos tales como
algoritmos como objetos. Podra describir estructuras de clases o objetos que son
sintomticas de un diseo inflexible. Algunas veces el problema incluir una lista de
condiciones que deben cumplirse para poder aplicar el patrn.
3. La solucin describe los elementos que forma el diseo, sus relaciones,
responsabilidades y colaboraciones. La solucin no describe un diseo particular o
implementacin, porque un patrn es como una plantilla que puede ser aplicada en
diferentes situaciones. En cambio, los patrones proveen una descripcin abstracta
de un problema de diseo y como una disposicin general de los elementos lo
soluciona.
4. Las consecuencias son los resultados de aplicar el patrn. Estas son muy
importantes para la evaluacin de diseos alternativos y para comprender los
costes y beneficios de la aplicacin del patrn

SELECCIN DE PATRN DE DISEO


De entre los diferentes patrones de diseo que existen puede ser complicado la
eleccin de uno para el diseo de una aplicacin. Entre las pautas que hay que seguir a la
hora de seleccionar un patrn se pueden indicar las siguientes:
1. Observar como el patrn de diseo resuelve los problemas de diseo.
2. Revisar las secciones de Objetivo.
3. Estudiar la interrelacin entre los diferentes patrones.
4. Estudiar los patrones con un propsito similar. Hay patrones que son muy
parecidos, estudiar sus similitudes y sus diferencias ayudar en la eleccin del
patrn que mejor se adapte al problema.
5. Examinar las razones de cambio. Mirar las causas de rediseo. Luego mirar los
patrones que te ayudan a evitar las causas de rediseo.
6. Considerar lo que se debera cambiar en el diseo concreto. El objetivo aqu es
encapsular el concepto que vara, un fin de muchos patrones de diseo. Son
aspectos del diseo que los patrones de diseo permiten que varen
independientemente, por lo tanto puedes hacer cambios sin redisear.

USO DE PATRN DE DISEO


Una vez seleccionado el patrn de diseo que se va a aplicar hay que tener en
cuenta las siguientes claves para utilizar el patrn:

Leer el patrn de diseo por encima.

Observar la estructura, los elementos que participan en el patrn y las


colaboraciones entre ellos. Asegurarse de comprender las clases y objetos del
patrn y como se relacionan.

Mirar un ejemplo concreto del patrn en cdigo. Estudiar el cdigo servir para la
implementacin del patrn.

Escoger nombres significativos de los elementos que participan en el patrn para el


contexto de la aplicacin. Los nombres de los elementos de un patrn son
normalmente demasiado abstractos para aparecer directamente en una aplicacin.

Definir las clases. Declarar sus interfaces, establecer sus relaciones de herencia, y
definir las variables instanciadas que representan datos y referencias de objetos.

Identificar las clases existentes en tu aplicacin que el patrn afectar y modificar


adecuadamente.

Definir nombres especficos para las operaciones en dicha aplicacin. Otra vez, los
nombres dependen generalmente de la aplicacin.

Implementar las operaciones que conllevan responsabilidad y colaboracin en el


patrn. La seccin Implementacin te ofrece una gua en la implementacin. Los
ejemplos de la seccin Cdigo del ejemplo tambin te ayudan.

CATLOGO DE PATRONES DE DISEO


De acuerdo a Laurent Debrauwe, estos patrones son diversas respuestas a
problemas conocidos de la programacin orientada a objetos. La lista que sigue no es
exhaustiva y es resultado de la experiencia. A continuacin mostramos los principales
patrones con una pequea descripcin de cada uno:

Abstract Factory: tiene como objetivo la creacin de objetos reagrupados en


familias sin tener que conocer las clases concretas destinadas a la creacin de
estos objetos.

Builder: permite separar la construccin de objetos complejos de su


implementacin de modo que un cliente pueda crear estos objetos complejos con
implementaciones diferentes.

Factory Method: tiene como objetivo presentar un mtodo abstracto para la


creacin de un objeto reportando a las subclases concretas la creacin efectiva.

Prototype: permite crear nuevos objetos por duplicacin de objetos existentes


llamados prototipos que disponen de la capacidad de clonacin.

Singleton: permite asegurar que de una clase concreta existe una nica instancia
y proporciona un mtodo nico que la devuelve.

Adapter: tiene como objetivo convertir la interfaz de una clase existente en la


interfaz esperada por los clientes tambin existentes para que puedan trabajar de
forma conjunta.

Bridge: tiene como objetivo separar los aspectos conceptuales de una jerarqua de
clases de su implementacin.

Composite: proporciona un marco de diseo de una composicin de objetos con


una profundidad de composicin variable, basando el diseo en un rbol.

Decorator: permite agregar dinmicamente funcionalidades suplementarias a un


objeto.

Facade: tiene como objetivo reagrupar las interfaces de un conjunto de objetos en


una interfaz unificada que resulte ms fcil de utilizar.

Flyweight: facilita la comparticin de un conjunto importante de objetos con


granularidad muy fina.

Proxy: construye un objeto que se substituye por otro objeto y que controla su
acceso.

Chain of responsibility: crea una cadena de objetos tal que si un objeto de la


cadena no puede responder a una peticin, la pueda transmitir a sus sucesores
hasta que uno de ellos responda.

Command: tiene como objetivo transformar una consulta en un objeto, facilitando


operaciones como la anulacin, la actualizacin de consultas y su seguimiento.

Interpreter: proporciona un marco para dar una representacin mediante objetos


de la gramtica de un lenguaje con el objetivo de evaluar, interpretndolas,
expresiones escritas en este lenguaje.

Iterator: proporciona un acceso secuencial a una coleccin de objetos sin que los
clientes se preocupen de la implementacin de esta coleccin.

Mediator: construye un objeto cuya vocacin es la gestin y el control de las


interacciones en el seno de un conjunto de objetos sin que estos elementos se
conozcan mutuamente.

Memento: salvaguarda y restaura el estado de un objeto. Observer: construye una


dependencia entre un sujeto y sus observadores de modo que cada modificacin
del sujeto sea notificada a los observadores para que puedan actualizar su estado.

State: permite a un objeto adaptar su comportamiento en funcin de su estado


interno.

Strategy: adapta el comportamiento y los algoritmos de un objeto en funcin de


una necesidad concreta sin por ello cargar las interacciones con los clientes de
este objeto.

Template Method: permite reportar en las subclases ciertas etapas de una de las
operaciones de un objeto, estando stas descritas en las subclases.

Visitor: construye una operacin a realizar en los elementos de un conjunto de


objetos. Es posible agregar nuevas operaciones sin modificar las clases de estos
objetos.
(Laurent Debrauwer)

RELACIN DE PRINCIPALES PATRONES GANG OF FOUR


PATRONES CREACIONALES
Los patrones creacionales ayudan a resolver los problemas relacionados con la
creacin de instancias de un clase, y as separar la implementacin del cliente de la de los
objetos que se utilizan. Nos ayudan a abstraer y encapsular su creacin.
Singleton

Abstract Factory

Builder

Factory Method

Object Pool

Prototype

Lazy initialization

Multiton

PATRONES ESTRUCTURALES

Utilizados para crear clases u objetos que incluidos dentro de estructuras ms


complejas.
Adapter

Bridge

Composite

Decorator

Facade

Flyweight

Front controller

Module

Proxy

Twin

PATRONES DE COMPORTAMIENTO
Se utilizan a la hora de definir como las clases y objetos interaccionan entre ellos.
Blackboard

Chain of Responsibility

Command

Interpreter

Iterator

Mediator

Memento

Null Object

Observer

Servant

Specification

State

Strategy

Template Method

Visitor
PATRONES DE CONCURRENCIA
Por ltimo, un modelo de concurrencia aborda algunos aspectos de la
programacin multihilo. Un patrn bien conocido en esta categora es productorconsumidor, en el que un hilo productor almacena un elemento en un tampn compartida
y un hilo consumidor recupera este artculo. El hilo productor no debe almacenar otro
elemento en este tampn hasta que el punto anterior se ha consumido, y el hilo
consumidor no debe consumir un elemento inexistente.
Active object

Balking

Binding properties

Double-checked locking

Guarded suspension

Lock

Monitor object

Reactor

Read-write lock

Scheduler

Thread pool

Thread-specific storage

PATRN SINGLETON
DESCRIPCIN
El patrn Singleton tiene como objetivo asegurar que una clase slo posee una
instancia y proporcionar un mtodo de clase nico que devuelva esta instancia. En ciertos
casos es til gestionar clases que posean una nica instancia.

PROPSITO
Garantiza que una clase slo tenga una instancia y proporciona un punto de
acceso global a ella.
MOTIVACIN
Es importante que algunas clases tengan exactamente una instancia. Cmo lo
podemos asegurar y que sta sea fcilmente accesible?. Una variable global no previene
de crear mltiples instancias de objetos. Una solucin mejor es hacer que sea la propia
clase la responsable de su nicainstancia, quien debe garantizar que no se pueda crear
ninguna otra (interceptando las peticiones para crear nuevos objetos) y proporcione un
modo de acceder a ella.
APLICABILIDAD
Usar Singleton cuando:

Deba haber exactamente una instancia de una clase y sta debe ser accesible a
los clientes desde un punto de acceso conocido.

La nica instancia debera ser extensible mediante herencia y los clientes deberan
ser capaces de usar una instancia extendida sin modificar su cdigo.

EJEMPLO
En el sistema de venta online de vehculos, debemos gestionar clases que poseen
una sola instancia. El sistema de documentacin que debe entregarse al cliente tras la
compra de un vehculo (como el certificado de cesin, la solicitud de matriculacin y la
orden de pedido) utiliza la clase DocumentacinEnBlanco que slo posee una instancia.
Esta instancia referencia todos los documentos necesarios para el cliente. Esta instancia
nica se llama la documentacin en blanco, pues los documentos a los que hace
referencia estn todos en blanco. La figura 1.1 ilustra el uso del patrn Singleton para la
clase DocumentacinEnBlanco. El atributo de clase instance contiene o bien null o bien la
nica instancia de la clase DocumentacinEnBlanco. El mtodo de clase Instance
reenva esta instancia nica devolviendo el valor del atributo instance. Si este atributo

Figura 1.1 - El patrn Singleton aplicado a la clase DocumentacinEnBlanco


ESTRUCTURA
1. DIAGRAMA DE CLASES
La figura 1.2 detalla la estructura genrica del patrn.

Figura 1.2 - Estructura del patrn Singleton


2. PARTICIPANTES

Singleton: Define una operacin Instancia que permite que los clientes accedan a
su nica instancia. Instancia es una operacin de clase.

Puede ser responsable de crear su nica instancia.

3. COLABORACIN
Los clientes acceden a la instancia de un Singleton exclusivamente a travs de la
operacin Instancia de sta.
4. VENTAJAS
1. Acceso controlado a la nica instancia: Encapsula su nica instancia, puede tener
un control estricto sobre como y cuando acceden a ella los clientes.
2. Espacio de nombres reducido: Es una mejora sobre las variables globales. Evita
contaminar el espacio de nombres con variables globales que almacenan las
instancias.
3. Permite el refinamiento de operaciones y la representacin: Se puede crear una
subclase de la clase Singleton, y es fcil configurar una aplicacin con una
instancia de esta clase extendida, incluso en tiempo de ejecucin.
4. Permite un nmero variable de instancias: Hace que sea fcil permitir mas de una
instancia de la clase. Solo se necesitara cambiar la operacin que otorga acceso a
la instancia del Singleton.
EJEMPLOS EN JAVA
1. DOCUMENTACIN EN BLANCO
La seccin de esta clase relativa al uso del patrn Singleton se muestra a
continuacin. El constructor de esta clase tiene una visibilidad privada de modo que slo
pueda utilizarlo el mtodo Instance. De este modo, ningn objeto externo a la clase
DocumentacionEnBlanco puede crear una instancia utilizando el operador new. Del
mismo modo, el atributo instance tambin tiene una visibilidad privada para que slo sea
posible acceder a l desde el mtodo de clase Instance.

// Clase DocumentacionEnBlanco
import java.util.*;
package testcomercial;
public class DocumentacionEnBlanco {
private static DocumentacionEnBlanco instance = null;
public static DocumentacionEnBlanco Instance() {
if (instance == null)
instance = new DocumentacionEnBlanco();
return instance;
}
}
2. LA CLASE COMERCIAL
En el sistema de venta de vehculos, queremos representar el vendedor mediante
una clase que permita memorizar su informacin en lugar de utilizar variables globales
que contienen respectivamente su nombre, su direccin, etc. La clase Comercial se
describe a continuacin:
// Clase Comercial
package testcomercial;
public class Comercial {
protected String nombre;
protected String direccion;
protected String email;
private static Comercial instance = null;
private Comercial(){}
public static Comercial Instance() {
if ( instance == null)
instance = new Comercial();
return instance;
}
public void visualizar() {
System.out.println("Nombre: " + nombre);
System.out.println("Direccin: " + direccion);
System.out.println("Email: " + email);

}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDireccion() {
return direccion;
}
public void setDireccion(String direccion) {
this.direccion = direccion;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2. LA CLASE MAIN TESTCOMERCIAL
El programa principal siguiente utiliza la clase Comercial.
//Clase Main TestComercial
package testcomercial;
public class TestComercial

public static void main(String[] args) {

// Inicializacin del comercial en el sistema

Comercial elComercial = Comercial.Instance();


elComercial.setNombre("Comercial Auto");
elComercial.setDireccion("Madrid");
elComercial.setEmail(comercial@comerciales.com");

visualizar();
}
public static void visualizar() {
Comercial elComercial = Comercial.Instance();
elComercial.visualizar();
}
}
Su ejecucin muestra que slo existe una instancia debido a que el mtodo visualiza de
TestComercial no recibe ningn parmetro.
//Salida en consola
Nombre: Comercial Auto
Direccin: Madrid
Email: comercial@comerciales.com

BIBLIOGRAFA
http://codecriticon.com/introduccion-patrones-diseno/
http://es.wikipedia.org/wiki/Patrn_de_diseo
UML y Patrones. Introduccin al anlisis y diseo orientado a objetos - Larman - Prentice
Hall
Patrones de diseo en Java - Los 23 modelos de diseo: descripcin y solucin ilustradas
en UML 2 y Java - Laurent Debrauwe
http://www.ecured.cu/index.php/Patrn_Singleton