2010-11-08 5 views
0

Je suis actuellement en utilisant mon usine comme ceci:modèle usine java question

public class AbstractFactory 
{ 
    public static AbstractHeader parseHeader(File file) 
    { 
      if(AFactory.canRead(file))return AFactory.parseHeader(file); 
      if(BFactory.canRead(file))return BFactory.parseHeader(file); 

      throw new UnsupportedOperationException("File ["+file+"] not supported"); 
    } 

    public static AbstractContent parseContent(AbstractHeader h) 
    { 
      if(h instanceof AHeader){ 
        return AFactory.parseContent((AHeader) h); 
      } 
      if(h instanceof BHeader){ 
        return BFactory.parseContent((BHeader) h); 
      } 
      throw new UnsupportedOperationException("Header not supported"); 
    } 
} 

le parseHeader() retourne une instance de l'une AHeader ou BHeader, et plus tard vous demandera le AbstractContent. Y a-t-il une meilleure manière de faire cela ? Sortir avec l'instanceof vérifie?

+0

+1 à la réponse de Darron. Aussi, une question de style: AbstractFactory n'est pas abstrait, donc le nom est trompeur. –

Répondre

5

Ajoutez le code suivant à vos classes existantes:

public abstract class AbstractHeader { 
    abstract AbstractContent parseContent(); 
} 

public class AHeader extends AbstractHeader { 
    public AbstractContent parseContent() { 
     return AFactory.parseContent((AHeader) h); 
    } 
} 

public class BHeader extends AbstractHeader { 
    public AbstractContent parseContent() { 
     return BFactory.parseContent((AHeader) h); 
    } 
} 

Maintenant, vous pouvez simplement appeler h.parseContent(). C'est ce qu'on appelle le polymorphisme.

+0

+1 Solution agréable et propre. Rend l'extension de la classe très facile. – helpermethod

+0

hors-cours! J'étais tellement aveugle avec l'idée d'usine que je n'ai même pas pensé à la solution la plus simple! – Anon