Cette question est opportune pour moi - j'écrivais presque exactement ce code hier. Remplacez simplement "Animal" par tout ce qui est pertinent dans mon projet, bien que je m'en tienne à "Animal" pour les besoins de la discussion ici. Au lieu d'une instruction «switch», j'avais une série un peu plus complexe d'instructions «if», impliquant plus que la simple comparaison d'une variable à certaines valeurs fixes. Mais c'est un détail. Une méthode d'usine statique semblait être un bon moyen de concevoir des choses, car la conception est née de la refactorisation de désordres de code rapides et sales.
J'ai rejeté cette conception au motif que la classe de base connaissait la classe dérivée. Si les classes LandAnimal et SeaAnimal sont petites, soignées et faciles, elles peuvent être dans le même fichier source. Mais j'ai de grandes méthodes compliquées pour lire des fichiers texte non conformes à des normes officiellement définies - je veux ma classe LandAnimal dans son propre fichier source.
Cela conduit à une dépendance de fichier circulaire - LandAnimal est dérivé d'Animal, mais Animal doit déjà savoir que LandAnimal, SeaAnimal et quinze autres classes existent. J'ai retiré la méthode d'usine, je l'ai placée dans son propre fichier (dans mon application principale, pas dans ma bibliothèque Animals). Avoir une méthode d'usine statique semblait mignon et intelligent, mais j'ai réalisé qu'elle ne résolvait en fait aucun problème de conception.
Je n'ai aucune idée de la façon dont cela se rapporte au C # idiomatique, car je change beaucoup de langage, j'ignore généralement les idiomes et les conventions propres aux langages et les piles de développement en dehors de mon travail habituel. Si quoi que ce soit, mon C # pourrait sembler "pythonique" si c'est significatif. Je vise la clarté générale.
De plus, je ne sais pas s'il y a un avantage à utiliser la méthode d'usine statique dans le cas de petites classes simples qui ne seront probablement pas étendues dans les travaux futurs - le tout dans un fichier source peut être bien dans certains cas.