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/)
Mirar un ejemplo concreto del patrn en cdigo. Estudiar el cdigo servir para la
implementacin del patrn.
Definir las clases. Declarar sus interfaces, establecer sus relaciones de herencia, y
definir las variables instanciadas que representan datos y referencias de objetos.
Definir nombres especficos para las operaciones en dicha aplicacin. Otra vez, los
nombres dependen generalmente de la aplicacin.
Singleton: permite asegurar que de una clase concreta existe una nica instancia
y proporciona un mtodo nico que la devuelve.
Bridge: tiene como objetivo separar los aspectos conceptuales de una jerarqua de
clases de su implementacin.
Proxy: construye un objeto que se substituye por otro objeto y que controla su
acceso.
Iterator: proporciona un acceso secuencial a una coleccin de objetos sin que los
clientes se preocupen de la implementacin de esta coleccin.
Template Method: permite reportar en las subclases ciertas etapas de una de las
operaciones de un objeto, estando stas descritas en las subclases.
Abstract Factory
Builder
Factory Method
Object Pool
Prototype
Lazy initialization
Multiton
PATRONES ESTRUCTURALES
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
Singleton: Define una operacin Instancia que permite que los clientes accedan a
su nica instancia. Instancia es una operacin de clase.
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
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