2010-06-29 3 views
3

Est-il possible d'avoir des usines de béton créer des classes concrètes avec des paramètres spécifiques de type pour eux, en utilisant le modèle d'usine abstraite? Ou est-ce que les différentes classes concrètes créées par leurs usines concrètes respectives doivent avoir les mêmes champs?Comment définir des propriétés spécifiques à une classe créée par une fabrique abstraite?

Ex) Dans l'image ci-dessous, comment allez-vous instancier le WinButton et le OSXButton avec différents ensembles d'arguments donnés par le client (Application)?

enter image description here

Répondre

0

L'une des approches pour résoudre ces problèmes est d'envoyer des paramètres d'objet. Exemple, dans C# Object est la classe de base & vous pouvez passer paramètre de type Object qui peut prendre n'importe quelle classe dérivée. Dans l'implémentation, cet objet peut être renvoyé au type dérivé souhaité. Même des propriétés spécifiques peuvent être définies de cette façon.

+0

Utilisation de la classe d'objets comme type générique puis coulée à une classe spécifique n'est pas une très bonne solution car il est de type pas sûr et il viole au moins un principe orienté objet à savoir le principe de substitution Liskov. En outre, les classes concrètes à créer peuvent nécessiter un nombre différent d'arguments pour leur construction respective. – Christian

+0

Je suis d'accord, ce n'est pas de type sécurisé. En ce qui concerne le nombre différent d'arguments, vous pouvez avoir un type qui est composé d'autres types. –

+0

Vous voulez dire une structure de données dans laquelle vous stockez des arguments de création pour les différents types de béton? Dans ce cas, la structure de données doit être modifiée chaque fois que vous ajoutez une nouvelle structure. – Christian

0

Ce n'est pas facile sans avoir plus de détails. Une chose que je ferais, est d'essayer de passer les arguments au constructeur de la classe d'usine concrète. Pour différents arguments, vous devrez créer une instance d'usine différente, ce qui n'est peut-être pas la meilleure solution, mais comme cela a été dit, cela dépend des détails.

Exemple:

 
    GUIFactory factory = new WinFactory(WIN_9x_THEME); 
    Button greyButton = factory.createButton(); 
    factory = new WinFactory(WIN_VISTA_THEME, 50); 
    Button semiTransparentButton = factory.createButton(); 
+0

C'est une façon de le faire, mais il vous manque en quelque sorte l'aspect abstrait du motif puisque, comme vous l'avez souligné, les classes d'usine devraient être réinstanciées pour chaque ensemble de nouvelles valeurs d'argument. Vous pouvez aussi bien instancier les classes concrètes directement au lieu de passer par les classes d'usine. – Christian

+0

@Christian: pas vraiment ... si vous connaissez les combinaisons d'ensembles d'arguments lors du codage, vous pouvez avoir des usines pour les usines - cela devient un peu complexe, alors peut-être qu'une solution basée sur Dependency Injection a plus de sens. En fin de compte, tout dépend de la langue et de l'application spécifiques. –

+0

hmmm ... les usines d'usines; avez-vous un exemple de code? À propos de cela en fonction de la langue et de l'application, les patterns ne sont-ils pas censés être agnostiques en termes de langage et d'application? – Christian

Questions connexes