2010-12-14 56 views
3

Ceci est un autre modèle de conception dans un code hérité que je ne pouvais pas trouver beaucoup sur google. Dans ce cas, une classe enfant étend son parent abstrait, mais tourne à droite autour et déclare une instance statique du parent:Quand et pourquoi une classe enfant déclare un membre d'instance statique de la classe parente?

public abstract class MessageBase { 
    protected DAOFactory factory; 
    // method declarations 
} 

public class EDWMessage extends MessageBase { 
    private static MessageBase instance; 

    public static MessageBase getInstance(Properties properties) { 
     if (instance == null) { 
      instance = new EDWMessageTransaction(properties, null); 
     } 
     return instance; 
    } 
//more code 
} 

Je ne suis pas sûr de comprendre ce conduirais ce modèle de conception (si elle est modèle connu). Est-ce une sorte de modèle de commodité pour éviter de déclarer statique chaque variable membre du parent? Ou est-ce destiné à autoriser plusieurs classes enfants à avoir chacune une instance du parent. Mais si c'est le cas, pourquoi l'utilisation excessive de l'héritage sur la simple composition?

Le reste du code n'indique pas pourquoi cela serait fait de cette manière. Toutes les pensées ou idées seraient très appréciées. Merci!

P.S. Je semble courir dans beaucoup de designpatterns dans ce code hérité que je ne sais pas manipuler. Merci à tous ceux qui m'ont déjà aidé.

Éditer: Expansion de l'exemple de code. Je modifierai à nouveau lorsque je découvrirai un endroit qui utilise réellement ce code. Yay pour pas de documentation.

+1

Comment la variable d'instance est-elle utilisée? – Ralph

Répondre

3

Ceci est un idiome courant pour l'initialisation de singleton paresseux thread-safe. Si vous pouvez avoir une classe singleton, vous déléguez à une classe d'instanciation statique privée.

public class MySingleton{ 

    private MySingleton(){ 

    } 

    public static MySingleton getInstance(){ 
     return SingletonCreator.INSTANCE; 
    } 

    private static class SingletonCreator{ 
    private static final MySingleton INSTNACE = new MySingleton(); 
    } 
} 

Je ne sais pas si cela est la façon dont votre classe enfant est utilisé, mais ce serait un cas d'utilisation d'une classe enfant tenant une instance statique de son parent

+0

+1: L'explication est logique, sauf que vous utilisez la composition, pas l'héritage pour votre exemple. Je suppose que cela n'invalide pas le raisonnement. Je vais étendre l'exemple de code que j'ai inclus pour voir si cela modifie la réponse du tout. Merci! – Riggy

0

L'intention initiale était sans doute que pour chaque sous-classe de MessageBase il ne devrait y avoir une instance et que vous pouvez accéder à cette instance avec une méthode commum dans la classe de base

vous pouvez donc itérer sur tous les types de messages et obtenir l'instance de chaque

mes 2cents