2017-10-08 3 views
0

J'apprends des modèles Desgin et rencontre un exemple très étrange dans HERE. Si nous avons une classe:Résumé Usine modèle - code inutilisé

public abstract class AbstractFactory { 
abstract Color getColor(String color); 
abstract Shape getShape(String shape) ; 
} 

qui, comme on peut le voir, a 2 types de méthodes qui crée des objets: des couleurs et des formes. Cette classe est abstraite si nous devons créer la mise en œuvre concrète de cette, laisse supposer que nous avons:

public class ShapeFactory extends AbstractFactory { 

@Override 
public Shape getShape(String shapeType){ 

// I skip implementation to keep post brief 

} 

@Override 
Color getColor(String color) { 
    return null; // It's useless method in this class! 
} 
} 

et deuxième mise en œuvre:

public class ColorFactory extends AbstractFactory { 

@Override 
public Shape getShape(String shapeType){ 
    return null; // It's useless method in this class! 
} 

@Override 
Color getColor(String color) { 

// I skip implementation to keep post brief 

} 
} 

Et ici vient ma question, dans les deux cas (béton usines) il ya une méthode qui est complètement inutile et ne devrait pas être là, mais comme nous avons créé la classe AbstractFactory nous devons implémenter les deux méthodes. N'est-ce pas une mauvaise pratique en programmation de créer des méthodes inutiles dans les classes qui n'en ont pas besoin? Devrait-il être fait autrement, pas comme le suggère le site Web?

+0

demandez-vous, une façon de sauter un remplaçant de la méthode? – Ravi

+0

Ce tutoriel n'a aucun sens du tout. Vous avez raison d'être confus. –

+0

Dans un certain point oui. Je suis confus car les schémas de becouse devraient rendre le code plus pertinent, mais dans ce cas il me semble que c'est loin des bonnes pratiques. Alors, que proposez-vous de changer dans ce code? – Michael213

Répondre

2

@ Michael213 - Vos implémentations concrètes ne sont pas correctes. Pour sûr, ils ne suivent pas le modèle Abstract Factory. Usine abstraite parle de familles de produits. échantillon d'usine abstrait (avec mes hypothèses) ressemblera à du code suivant. votre exemple utilisant une seule méthode sera une mauvaise utilisation du modèle et se brisera bientôt.

Je l'ai déjà répondre à la même question s'il vous plaît allez voir que aussi What are the real benefits of using the Abstract Factory in the following example, instead of the factory method?

public abstract class AbstractFactory { 
     abstract Color getColor(String color); 
     abstract Shape getShape(String shape) ; 
    } 
    /** 
    * CONCRETE FACTORY1 
    */ 
    class HighResolutionFactory extends AbstractFactory{ 
     Color getColor(String color){ 
      return new HighResolutionColor(); 
     } 
     Shape getShape(String shape){ 
      return new HighResolutionShape(); 
     } 
    } 

    /** 
    * CONCRETE FACTORY2 
    */ 
    class LowResolutionFactory extends AbstractFactory{ 
     Color getColor(String color){ 
      return new LowResolutionColor(); 
     } 
     Shape getShape(String shape){ 
      return new LowResolutionShape(); 
     } 
    } 
    class Color{} // ABSTRACT PRODUCT 1 
    class Shape{} // ABSTRACT PRODUCT 2 
    class HighResolutionColor extends Color{}// CONCRETE PRODUCT1 FACT 1 
    class HighResolutionShape extends Shape{}// CONCRETE PRODUCT2 FACT 1 
    class LowResolutionColor extends Color{}//... 
    class LowResolutionShape extends Shape{} 
0

Oui, ce tutoriel ne semble pas le meilleur à cet égard. Ce n'est pas idéal bien qu'il compte toujours comme un motif de conception d'usine.

0

AbstractFactory est incorrect. Vous n'avez pas à penser à une usine qui fabrique des objets différents. Il est juste de faire des usines séparées pour chaque type différent.

public interface AbstractColorFactory { 
    public Color getColor(String color); 
} 

public interface AbstractShapeFactory { 
    public Shape getShape(String shape); 
} 

public class ColorFactory implements AbstractColorFactory { 
    public Color getColor(String color) { 
     return .... 
    } 
} 

public class ShapeFactory implements AbstractShapeFactory { 
    public Shape getShape(String shape) { 
     return .... 
    } 
} 
+0

Oui, mais dans ces approches, nous ne faisons rien de plus que le modèle d'usine normal! Nous ajoutons seulement une classe abstraite supplémentaire – Michael213

+0

Une classe abstraite est utilisée lorsque vous réutilisez la logique. Dans ce cas, il n'y a pas de réutilisation de la logique, il est donc préférable d'utiliser des interfaces plutôt que des classes abstraites. Vous devriez garder à l'esprit que 'Color' et' Shape' devraient aussi être des interfaces (ou des classes abstraites). S'il existe des instances spécifiques, il est préférable d'utiliser les méthodes statiques 'Color.newInstance (String)' et 'Shape.newInstance (String)'. Néanmoins, vous-même remarquez que dans votre version vous devez faire l'implémentation de méthodes que vous n'utiliserez jamais. –