Esta pregunta es oportuna para mí: ayer escribí casi exactamente ese código. Simplemente reemplace "Animal" con lo que sea relevante en mi proyecto, aunque me quedaré con "Animal" en aras de la discusión aquí. En lugar de una declaración de 'cambio', tuve una serie algo más compleja de declaraciones de 'si', que involucra más que solo comparar una variable con ciertos valores fijos. Pero eso es un detalle. Un método de fábrica estático parecía una forma ordenada de diseñar cosas, ya que el diseño surgió de la refactorización de desorden de código rápido y sucio.
Rechacé este diseño porque la clase base tenía conocimiento de la clase derivada. Si las clases LandAnimal y SeaAnimal son pequeñas, ordenadas y fáciles, pueden estar en el mismo archivo fuente. Pero tengo grandes métodos desordenados para leer archivos de texto que no se ajustan a ningún estándar oficialmente definido: quiero que mi clase LandAnimal esté en su propio archivo fuente.
Eso conduce a la dependencia del archivo circular: LandAnimal se deriva de Animal, pero Animal ya debe saber que existen LandAnimal, SeaAnimal y otras quince clases. Saqué el método de fábrica, lo puse en su propio archivo (en mi aplicación principal, no en mi biblioteca de animales) Tener un método de fábrica estático parecía lindo e inteligente, pero me di cuenta de que en realidad no resolvió ningún problema de diseño.
No tengo idea de cómo se relaciona esto con C # idiomático, ya que cambio mucho los idiomas, generalmente ignoro los modismos y las convenciones propios de los idiomas y las pilas de desarrolladores fuera de mi trabajo habitual. En todo caso, mi C # podría verse "pitónico" si eso es significativo. Apunto a la claridad general.
Además, no sé si sería ventajoso usar el método estático de fábrica en el caso de clases pequeñas y simples que probablemente no se extiendan en el trabajo futuro; tenerlo todo en un solo archivo fuente podría ser bueno en algunos casos.