2009-02-21 14 views
1

Possible en double:
What is your threshold to use factory instead of a constructor to create an object?Quel est l'avantage d'avoir toutes mes classes instanciées uniquement via le DP usine?

Quel est l'avantage d'avoir toutes mes classes instanciées que par l'usine DP?

Pour autant que savoir une usine est bonne lorsque vous avez à choisir parmi une liste d'objets similaires pour effectuer une tâche, disons comme les classes de traduction (anglais-> franch, arabe-> hébreu ...) Mais quand vous avez vraiment une option possible, aucune raison d'obscurcir/abstrait la logique avec une méthode Factory.

Des idées?

+0

Cochez cette question sur SO: [Quel est votre seuil pour utiliser une fabrique au lieu d'un constructeur pour créer un objet?] (Http://stackoverflow.com/questions/489623/what-is-your-threshold-to- use-factory-au lieu-de-un-constructeur-de-créer-un-objet) –

Répondre

1

Comment savez-vous qu'il n'y aura pas d'autres possibilités dans le futur? L'une des raisons les plus fréquentes pour changer l'implémentation de la dépendance est pour les tests unitaires. Voulez-vous vraiment que toutes les dépendances utilisent leurs implémentations réelles lorsque vous écrivez des tests unitaires pour cela? Parfaitement lors de l'écriture d'une classe, vous déclarez ce dont elle a besoin pour faire son travail en tant qu'arguments dans le constructeur, sans se soucier d'où viennent les implémentations. L'utilisation d'usines est une option pour cela, mieux vaut utiliser un conteneur d'injection de dépendances. Il y a assez peu de conteneurs open source - choisissez-en un qui convient à vos besoins.

1

Vous ne voulez probablement pas que toutes vos classes proviennent d'une usine écrite à la main. L'injection de dépendances peut être plus utile, vous pouvez écrire des objets et n'importe quel framework DI que vous utilisez peut simplement remplir vos objets pour vous. Si vous utilisez pleinement DI, le nombre de "nouveaux" appels dans votre code va descendre.

Nous utilisons beaucoup Spring, et Spring.NET, mais il y a beaucoup d'autres options aussi.

2

Un avantage général des méthodes d'usine est que vous pouvez contrôler la création d'objets derrière l'interface publique. Ainsi, sans affecter le code client, vous pouvez ajouter des choses comme des mécanismes de mise en cache plus tard.

1

Une utilisation du modèle d'usine est de surmonter la constructor limitations que vous trouvez dans des langues comme Java et C#:

  1. Un constructeur ne peut retourner une instance de la classe associée, jamais un sous-type - même si un sous-type serait acceptable, par définition.

  2. Un constructeur doit toujours renvoyer un nouvel objet, jamais un objet précédemment alloué. Cela peut être gênant - par exemple, il n'y a vraiment pas besoin d'avoir plusieurs instances d'objets égaux immuables.

2

Écrivez simplement votre code: utilisez des constructeurs. Si vous trouvez que les constructeurs vous limitent plus tard, réfutez-vous à ce point pour utiliser une usine. Évitez le design spéculatif: il ajoute de la complexité avec peu de valeur réelle.