Disons que j'ai une boisson de classe abstraite, et une méthode d'usine qui choisit le type de boisson (vin, bière, etc.) à créer à l'exécution.Passer des arguments à une sous-classe spécifique, par une méthode d'usine
Chaque boisson a besoin d'arguments pour s'initialiser correctement. Certains d'entre eux sont communs à toutes les boissons; par exemple, ils peuvent tous avoir besoin d'un argument DrinkConfig.
Mais chaque boisson peut aussi avoir ses propres exigences. Peut-être que Wine a besoin d'un objet auxiliaire Sommelier pour s'initialiser. La bière n'a pas besoin de cela, mais elle peut avoir besoin de ses propres objets auxiliaires.
Alors, que dois-je passer à la méthode d'usine? Quand je l'appelle, j'ai tous les objets auxiliaires disponibles, alors je pourrais simplement les passer tous à l'usine. Mais cela pourrait aboutir à beaucoup d'arguments. Y a-t-il une meilleure façon de concevoir cela?
EDIT: Supposons que je ne peux pas simplement créer les objets auxiliaires en usine; ils sont uniquement disponibles auprès de l'appelant.
Les signatures sont correctes. Le problème est de savoir comment transmettre des arguments à votre Factory :: CreateDrink() (ou à tout autre nom). – dirkgently
Si vous souhaitez avoir une méthode CreateDrink en usine, vous pouvez utiliser un paramètre enum pour spécifier quel type de boisson vous voulez. Je ne crois pas que l'approche ci-dessus soit conforme au modèle d'usine du GoF, où les objets sont créés dans la classe Drink (je dois consulter mon livre ce soir), mais je le trouve beaucoup plus pragmatique et conserve le principal avantage de la création centralisée d'objets pour les hiérarchies de sous-classe. – sipwiz
Après avoir vérifié mon livre GoF Design Patterns, je suis heureux que l'exemple que j'ai donné ci-dessus montre à quel point vous utilisez une Factory dans le cadre du motif de conception d'Abstract Factory. Pour se conformer complètement, il devrait y avoir une classe d'usine abstraite dont DrinkFactory hérite, mais pour les cas simples comme celui-ci, je le laisse normalement de côté. Il serait assez facile de refactoriser DrinkFactory si une autre usine de béton était nécessaire. – sipwiz