2009-09-30 12 views

Respuesta

22

Cada clase puede implementar una interfaz, y Singleton es solo una clase "normal" que se asegura de que exista una sola instancia en un momento dado, aparte de la otra lógica empresarial que pueda implementar. Esto también significa que un Singleton tiene al menos 2 responsabilidades y este no es un buen diseño de OO ya que las clases solo deben tener 1 responsabilidad y asegurarse de que sean buenas en esa responsabilidad, pero esa es otra discusión.

+0

¿Por qué un Singleton no es bueno OO design? De hecho, es uno de los patrones de diseño de OO más comunes. –

+2

@ChristianVielma: (Sí, tarde) El problema es que crea * estado global *, al igual que * variables globales *, y adolece de problemas similares. Por ejemplo, es difícil probar las clases que solicitan internamente singleton sin conocimiento externo. ¿Su DB de producción está lleno de basura/datos de prueba? Verifique los singletons. Buscando un error? Si tiene singletons, y por lo tanto estado global, no puede enfocarse solo en un alcance limitado; debes tener en mente el código base. Gracias a Singleton. Tenga en cuenta que esto se trata del patrón singleton *, no de los objetos singleton *. El uso común no significa que debe ser "bueno". – ray

0

Un singleton tiene una instancia, simplemente nunca tiene más de una instancia. Probablemente use un par de miembros estáticos para buscar referencias y para asegurarse de que nunca se multipliquen, pero en su mayor parte la clase es igual a cualquier otra clase.

10

Algo así como:

public interface MyInterface 
{ 
} 

Y

public class MySingleton implements MyInterface 
{ 
    private static MyInterface instance = new MySingleton(); 

    private MySingleton() 
    { 
    } 

    public static MyInterface getInstance() 
    { 
    return instance; 
    } 
} 
+2

Necesita agregar un constructor no-args privado a esa clase para convertirlo en un singleton. –

+7

Para su información, la mejor manera en Java para implementar un Singleton es mediante el uso de una enumeración de un solo elemento.Es más conciso que el enfoque de campo público y proporciona el mecanismo de serialización de forma gratuita y también proporciona seguridad contra los ataques de reflexión. Este método aún no se ha adoptado ampliamente, pero podría ser interesante saberlo. Para obtener más información, consulte el artículo al respecto en "Java eficaz" por Joshua Bloch. – nkr1pt

+0

@Andrew: gracias, estaba saltando entre SO y el trabajo del día y lo perdí por accidente :-) –

0

Básicamente, una clase singleton es una clase que se puede instanciar una y sólo una vez. El patrón de clase singleton se implementa mediante el uso de un método estático para obtener la instancia de la clase singleton y restringir el acceso a su (s) constructor (es).

Al igual que con el uso de una interfaz, sería similar a la forma en que cualquier otra clase implementaría una interfaz.

Y tampoco debería permitir la clonación de ese objeto.

5

Creo que entendí su problema. Desea definir el método de fábrica en la interfaz (método estático para getInstance()). Pero como el método de fábrica no se puede definir en la interfaz, esa lógica no funcionará.

Una opción es tener una clase de fábrica que contenga ese método estático. Por lo que habrá tres clases primera clase para mantener estática método segunda es la interfaz tercera es la clase concreta

, pero no podemos hacer que el constructor privado de hormigón.

Pero si su infraestructura cuenta con dos paquetes uno para público y otro para uso privado

definir la interfaz en público, realizar nivel de paquete de clase concreta (sin ningún modificador de acceso) y la clase de fábrica y el método estático sean públicas.

Espero que esto pueda ayudarlo.

Cuestiones relacionadas