Estaba buscando información sobre un patron de diseño en particular, pero no encontré nada en tarina, y después me percate que no había nada sobre ningún patrón en taringa. En una comunidad de inteligencia colectiva, los patrones de diseño no pueden quedar afuera, son una herramienta fundamental de la programacion orientada objetos para la construcción de software de calidad.

Primero que nada para el que no sepa que es según wikipedia:


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 reutilizable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.



Segun yo:


Un patrón de diseño es una solución que se aplica a problemas diferentes con estructuras similares, es decir, problemas que tienen formas parecidas suelen tener soluciones parecidas.




Voy a explicar algunos patrones sencillos y voy a tratar de poner como se implementan en Java
Patron Singleton:

Motivacion:
Es necesario que se cuente con una sola instancia de una clase, es decir, que exista una sola instancia de una clase determinada, y que el sistema no permita que se creen nuevas.

Diagrama UML:

Patrones de Diseño (Singleton)

Normalmente el patrón singleton se utiliza para la instanciacion de clases que "stateless" es decir que no tienen estado (Sin variables de instancia que signifiquen una diferencia entre la instancia a y la instancia b).

Que una clase sea stateless supone, casi siempre, que solo contenga comportamiento y ningun tipo de variable de instancia, aunque esto no es siempre así, casi siempre que una clase Singleton tenga variables de instancia supone un riesgo de sección critica en sistemas concurrentes, pero si se quiere implementar un semaforo o un contador se puede hacer con variables de instancia. .

Para explicar como funciona este patron voy a plantear un ejemplo:


Para la simplemente de La clase Calculadora:
diseño




La clase Es stateless, no mantiene ningun tipo de estado, por lo que vamos a implementarla como un Singleton:

JAVA:



public class Calculadora {

private static Calculadora calculadora;

public static synchronized Calculadora getInstance() {
if (calculadora == null){
calculadora = new Calculadora();
}
return calculadora;
}

private Calculadora(){

}
public int suma (int a, int b){
return a+b;
}

public int resta (int a, int b){
return a-b;
}

public int multiplicacion (int a, int b){
return a*b;
}

public double division (int a, int b){
return a/b;
}

}





Explicando un poco el codigo:


La parte importante esta dada por los metodos que se encargan de la instanciacion:



private static Calculadora calculadora;

public static synchronized Calculadora getInstance() {
if (calculadora == null){
calculadora = new Calculadora();
}
return calculadora;
}

private Calculadora(){

}




La variable de clase


private static Calculadora calculadora;



Es donde se guardara la 'Unica instancia' de la clase Calculadora.

Se declara privado el constructor de la clase Calculadora

private Calculadora(){
}



Esto logra que "No se pueda instanciar a Calculadora, salvo desde si misma."

luego se define el metodo:

public static synchronized Calculadora getInstance() {
if (calculadora == null){
calculadora = new Calculadora();
}
return calculadora;
}



Este metodo es el encargado de devolvernos la instancia unica de Calculadora.
Como se ve, si la variable de clase "calculadora" es null,
instancia una nueva,
la guarda en la variable de clase "calculadora"
y luego la devuelve

La siguiente vez que se invoque este metodo, calculadora no sera null, por lo que se devolvera la misma instancia.

¿Por que el metodo es synchonized ?
Esto es por que en ambientes concurrentes podria instanciarse mas de una vez Calculadora si se ejecuta el metodo getInstance desde distintos hilos.


Bueno, espero que sea util esta información para alguien, cuando tenga tiempo voy a agregar otros patrones, como adapter, strategy, state, factory..

Cuentenme que les parece el post, para tener en cuenta para el proximo.!