Esta pergunta é oportuna para mim - eu estava escrevendo quase exatamente esse código ontem. Apenas substitua "Animal" pelo que for relevante em meu projeto, embora eu continue com "Animal" para fins de discussão aqui. Em vez de uma declaração 'switch', eu tinha uma série um pouco mais complexa de declarações 'if', envolvendo mais do que apenas comparar uma variável a certos valores fixos. Mas isso é um detalhe. Um método estático de fábrica parecia uma maneira elegante de projetar coisas, pois o design surgiu da refatoração de bagunças de código rápidas e sujas anteriores.
Rejeitei esse design com base na classe base que tinha conhecimento da classe derivada. Se as classes LandAnimal e SeaAnimal forem pequenas, organizadas e fáceis, elas poderão estar no mesmo arquivo de origem. Mas tenho grandes métodos confusos para ler arquivos de texto que não estão em conformidade com nenhum padrão oficialmente definido - quero minha classe LandAnimal em seu próprio arquivo de origem.
Isso leva à dependência do arquivo circular - o LandAnimal é derivado de Animal, mas o Animal precisa saber que LandAnimal, SeaAnimal e quinze outras classes existem. Peguei o método de fábrica, coloquei em seu próprio arquivo (no meu aplicativo principal, não na minha biblioteca Animals) Ter um método de fábrica estático parecia bonito e inteligente, mas percebi que ele realmente não resolveu nenhum problema de design.
Não tenho idéia de como isso se relaciona com o C # idiomático, já que mudo muito de idioma, geralmente ignoro idiomas e convenções peculiares a idiomas e pilhas de desenvolvimento fora do meu trabalho habitual. Se alguma coisa meu C # pode parecer "pitônico", se isso é significativo. Eu busco clareza geral.
Além disso, não sei se havia uma vantagem em usar o método estático de fábrica no caso de classes pequenas e simples que provavelmente não serão estendidas em trabalhos futuros - ter tudo em um arquivo de origem pode ser bom em alguns casos.