2010-01-05 22 views
9

¿Alguien puede proporcionar un ejemplo de un patrón singleton y explicar por qué son necesarios?Implementación del patrón singleton en Java

+4

Para aceptar respuestas a sus preguntas, es necesario hacer clic la marca de verificación que aparece en gris debajo del puntaje de una respuesta: estas marcas se volverán verdes, lo que significa que usted las aceptó, consulte http://stackoverflow.com/faq –

Respuesta

27

Antes de ir por la ruta singleton, reconsidere. ¿Realmente necesitas un singleton? Si está pidiendo escenarios cuando necesita implementar singletons, es porque la necesidad de ellos realmente no se expresó. Es mejor que no introduzca singletons en su base de códigos solo porque se siente bien seguir los patrones de diseño.

Clean Code Talks - Global State and Singletons

Once Is Not Enough

Performant Singletons

Sin embargo, lo que realmente vale la pena conocer es Dependency Injection.

Ahora bien, si usted realmente desea implementar únicos en Java, recomendaría forma de Joshua Bloch "Effective Java" de implementarlos:

public class Singleton 
{ 
    public static Singleton getInstance() { 
    return SingletonHolder.instance; 
    } 

    private Singleton() {} 

    private static final class SingletonHolder { 
    static final Singleton instance = new Singleton();  
    } 
} 

El JLS garantiza la JVM no va a inicializar instancia hasta que alguien llama getInstance();

Nota final, el Double Checked Locking Pattern is broken in Java up to Java 5. The Java 5 memory model makes the DCL pattern thread safe but it makes it slower than the SingletonHolder class method while the original intent was performance optimization.

EDIT: Como @Luno señaló, since the second edition of the book, the preferred way is:

partir de la versión 1.5, hay un tercer enfoque para conjuntos unitarios de ejecución. Basta con hacer un tipo de enumeración con un elemento:

// Enum singleton - the preferred approach 
public enum Elvis { 
    INSTANCE; 

    public void leaveTheBuilding() { ... } 
} 

Este enfoque es funcionalmente equivalente a la aproximación del campo público, excepto que es más conciso, proporciona el mecanismo de serialización de forma gratuita, y proporciona una garantía rigurosa contra la creación de instancias múltiples, incluso frente a una sofisticada serialización o ataques de reflexión. Si bien este enfoque aún no se ha adoptado ampliamente, un tipo de elemento enum es la mejor manera de implementar un singleton.

+7

. De hecho, Josh Bloch escribe que la mejor manera de implementar Singleton es para usar enum. enumeración MySingletonClass { INSTANCE; } Como se trata de guardar las cadenas, no presenta problemas de serialización ni riesgos de seguridad. –

+1

De hecho, en la segunda edición de Effective Java, Joshua Bloch escribe que ** un tipo de elemento enum es la mejor manera de implementar un singleton ** (http://www.informit.com/articles/article.aspx? p = 1216151 & seqNum = 3). –

+0

@Luno & @Pacal: sí, busqué en Google un extracto y edité la respuesta para completarlo –

2

Básicamente, en Java que implemente Singleton dando una clase de un no-args constructor privado (private MyClass()), y de forma estática (o perezoso) inicializar una sola instancia de la clase que sea devuelto por un método estático MyClass getInstance().

Lo utilizará cuando desee que no haya más de una sola instancia de su clase a lo largo de toda la aplicación.

0

'Simply Singleton' en JavaWorld

Y si realmente desea conseguir en las trincheras, comenzar a leer acerca de "estática vs Singleton" en la groups, o Google él. ¡Siempre es un tema candente para decir lo menos!

1

danben tiene un muy buen resumen de lo que es un singleton, así que no voy a repetirlo.

En lo que respecta a los usos, los singletons a menudo son implementaciones apenas veladas de variables globales (lo cual es una mala idea).Pueden ser útiles para cosas como enrutadores de mensajes o clases de administrador (entre otras cosas).

0

Un lugar que a menudo se subestima donde los singletons son buenos es cuando se quiere abstraer la existencia del estado. Un ejemplo es un generador de números aleatorios. En el nivel de la abstracción, solo genera números aleatorios y no tiene ningún estado que la persona que llama deba preocuparse. En el nivel de implementación, sin embargo, el estado está involucrado. Otro es cuando una función almacena resultados en caché o cálculos intermedios, pero desea ocultar este detalle de la persona que llama.

Aquí hay una compensación importante. Si crea cosas como estos singletons, disminuirá la cantidad de detalles de implementación que debe preocupar a la persona que llama de su función, disminuyendo así el acoplamiento en esa dirección. Sin embargo, al mismo tiempo acoplas fuertemente tu función al objeto singleton, lo que dificulta la prueba, etc. La decisión sobre si usar un singleton debe basarse en la dirección en la que te importa reducir el acoplamiento en más.

0

supone que tiene sólo una impresora en la oficina y necesitas Asegurar una clase de impresora tiene sólo una instancia

printer{ 
private static printer instance =null; 
private printer(){} 
public static printer getinst(){ 
if(instance==null){ 
instant = new printer(); 

} 
return instance; 


} 


} 

en el principal

printer v=printer.geti(); 
Cuestiones relacionadas