2010-12-08 23 views
3

De par sa conception, dans le modèle Singleton, le constructeur doit être marqué private et fournir une méthode de création qui réaccorde le membre statique privé de l'instance de même type. J'ai créé mes classes de singleton comme ceci seulement.Dois-je créer un constructeur protégé pour mes classes singleton?

public class SingletonPattern {// singleton class 

    private static SingletonPattern pattern = new SingletonPattern(); 

    private SingletonPattern() { 

    } 

    public static SingletonPattern getInstance() { 
     return pattern; 
    } 

} 

Maintenant, je dois étendre une classe singleton pour ajouter de nouveaux comportements. Mais le constructeur privé ne laisse pas définir la classe enfant. Je pensais changer le constructeur par défaut en constructeur protégé pour la classe de base singleton.

Qu'est-ce qui peut poser problème, si je définis mes constructeurs comme protected?

Vous recherchez des avis d'experts ....

Répondre

6

Si vous étendez une classe singleton par héritage, vous aurez 2 instances de la classe singleton en cours d'exécution si quelqu'un attraper autour de votre singleton et le singleton d'origine.

Si le singleton original est conceptuellement supposé être un singleton, l'utilisation de la composition est probablement la solution. Cependant, alors la substituabilité est perdue (votre classe n'est pas substituable au singleton original, elle l'utilise juste).

Avez-vous un exemple concret?

1

Si vous faites cela, ce n'est pas un singleton. Mais peut-être n'avez-vous pas vraiment besoin d'un singleton.

0

Ceci n'est pas la classe Singleton. Imaginons que je puisse appeler la méthode statique getInstance() n nombre de fois et que je puisse avoir n objets de cette classe en violation totale de Singleton Pattern. Pour le rendre Singleton, vous devriez vérifier si l'objet est déjà créé ou non dans la méthode getInstance(). Si déjà créé, vous devez ignorer et ne pas créer à nouveau. Par exemple, vous pouvez donc quelque chose de similaire, s'il vous plaît ignorer les erreurs de syntaxe, juste un code pour expliquer, peut varier dans différentes langues.

public class SingletonPattern {// singleton class 

private static SingletonPattern pattern = new SingletonPattern(); 

private SingletonPattern() { 

} 

public static SingletonPattern getInstance() { 
    if(SingletonPattern == null) { 
     return new SingletonPattern(); 
    } 
} 
0

question Je sais, mais est arrivé de tomber par hasard sur cela et pense que je peux ajouter quelque chose d'utile.

Il est possible d'avoir un constructeur protégé dans une classe singleton. Si vous voulez avoir un comportement polymorphe sur votre singleton, vous pouvez en faire une classe abstraite, définir le constructeur comme protégé et déléguer la création de l'instance à l'une des sous-classes concrètes.

Je trouve l'exemple suivant dans le livre "Design Patterns expliqué":

abstract public class Tax{ 
    static private Tax instance; 

    protected Tax() {}; 

    abstract double calcTax(double qty, double price); 

    public static Tax getInstance() { 
     // code to determine what implementing class to use 
     instance = USTax.getInstance(); 
     return instance; 
    } 
} 

public class USTax extends Tax { 
    private static USTax instance; 
    private USTax() { 
    // instantation local members + Tax abstract class 
} 

public double calcTax (double qty, double price){ 
    // implementation 
} 

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