2011-06-10 18 views
8

Tengo un conjunto de clases singleton y quiero evitar el código repetitivo. Aquí es lo que tengo ahora:Java singleton con herencia

public class Mammal { 
    protected Mammal() {} 
} 

public class Cat extends Mammal { 
    static protected Cat instance = null; 
    static public Cat getInstance() { 
     if (null == instance) { 
      instance = new Cat(); 
     } 
     return instance; 
    } 

    private Cat() { 
     // something cat-specific 
    } 
} 

Esto funciona y no hay nada malo en ello, excepto que tengo muchas subclases de Mammal que deben replicar el método getInstance(). Yo preferiría algo como esto, si es posible:

public class Mammal { 
    protected Mammal() {} 

    static protected Mammal instance = null; 

    static public Mammal getInstance() { 
     if (null == instance) { 
      instance = new Mammal(); 
     } 
     return instance; 
    } 
} 

public class Cat extends Mammal { 
    private Cat() { 
     // something cat-specific 
    } 
} 

¿Cómo se hace eso?

+1

Su Singleton getInstance() no se realiza correctamente. - en un entorno multi-hilo que pueda ¡Termine con múltiples instancias siendo creadas! – Liv

+1

No es una respuesta a su pregunta, pero su patrón singleton no es seguro para subprocesos. Hay ejemplos en [Concurrencia de Java en la práctica] (http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601). – Bruno

+0

¿Es realmente un singleton el mejor enfoque aquí? Los singletons se usan mejor para representar servicios u otras cosas que realmente solo hay una instancia en el mundo real. Asegúrese de que este patrón sea realmente adecuado para su dominio de aplicación porque supongo que su código no está realmente usando gatos y perros. Si los singleton son apropiados, recomiendo usar la solución de Jim Garrison de usar Spring; los granos de primavera son singleton por defecto. –

Respuesta

3

No se puede ya que los constructores no son ni heredados ni reemplazables. El new Mammal() en su ejemplo deseado crea solo un Mammal, no una de sus subclases. Le sugiero que mire el patrón Factory o vaya a algo parecido a Spring, que está destinado solo para esta situación.

2

Puede usar enum para crear singletons.

public enum Mammal { 
    Cat { 
     // put custom fields and methods here 
    } 
} 
0

Haga que su Constructor sea privado, esto evitará que su clase sea heredada por otras clases.

O la mejor manera de crear un producto único es mediante la creación de su clase de una enumeración con una enumeración (Josh Block) Método