El post que buscas se encuentra eliminado, pero este también te puede interesar

Patrones de Diseño (Singleton)

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.!

11 comentarios - Patrones de Diseño (Singleton)

@pablods04 +1
Excelente pana, pon mas!
@maxito_DG
Gracias che! voy a tratar de poner algun post mas pronto, estuve muy ocupado ultimamente, pero ya voy a hacer tiempo, para agregar alguno mas
@Cecilia_1408 +2
Gracias!!! gracias!!!

No lo podía entender!!!
O sea...era algo que hacía en la práctica y cuando empecé a leer lo que explicaste... fue un: "Doh...! ¿esto era?"
@maxito_DG
Gracias, me alegro que te haya servido!
@Melif2011
Muy bueno, lo voy a tener en cuenta porque estuve renegando bastante para entender este patrón, pone algo del patrón Observer si tenes
@maxito_DG +2
Voy a tratar de armar algo, tenia algo medio preparado de Strategy, Pero el Observer es un poco mas sencillo de explicar, voy a ver si puedo esta semana
@federernojuega
Al fiiin alguien q lo explica como la gentee!!! Seguí loco!! Seguí subiendo mas patrones, por favor! jajaj
@gzdncs
Factory. Porf
@chuia
Tengo tu codigo, y en mi clase que contiene el metodo main hago esto.




public class Principal {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        new Calculadora();
        
        System.out.println(Calculadora.calculadora.suma(20, 1));





Lo ejecuto y me da error, me tira la NullPointerException. Alquien que me ayude ?
@maxito_DG
tarde pero seguro:
No se supone que hagas new Calculadora(). no hace falta.

Algo asi:

public static void main(String[] args) {


System.out.println(Calculadora.getInstance().suma(20, 1));

}
@chuia
@maxito_DG si, y yo tarde en darme cuenta jaja!. Adentro de la clase Singleton ya se crea la instancia. Sabes que estudio desarrollo de software y tengo que dar estos patrones y los demas, creo que el memento no y proxy tampoco, pero los demas si. Me tiran ejercicios en los parciales pero me matan, donde puedo ver ejemplos que no tengan mucho codigo chorizo y con normativas estandares ?
@Ingeniero_JD
haciendo uso del patron singleton generar un programa que permita realizar una calculadora basica quien me ayuda
@zerart245
Ja ja ja pero si el ya lo hizo en el ejemplo solo tienes que implementar las funciones