Этот вопрос для меня актуален - вчера я писал почти такой код. Просто замените «Animal» тем, что имеет отношение к моему проекту, хотя я остановлюсь на «Animal» для обсуждения здесь. Вместо оператора «switch» у меня была несколько более сложная серия операторов «if», включающая не только сравнение одной переменной с определенными фиксированными значениями. Но это деталь. Статический фабричный метод казался изящным способом проектирования вещей, так как дизайн возник из рефакторинга ранних быстрых и грязных кодов.
Я отклонил этот проект на основании того, что базовый класс обладает знанием производного класса. Если классы LandAnimal и SeaAnimal маленькие, аккуратные и простые, они могут находиться в одном исходном файле. Но у меня есть большие грязные методы для чтения текстовых файлов, не соответствующих каким-либо официально определенным стандартам - я хочу, чтобы мой класс LandAnimal находился в его собственном исходном файле.
Это приводит к циклической зависимости файла - LandAnimal происходит от Animal, но Animal уже должен знать, что существуют LandAnimal, SeaAnimal и пятнадцать других классов. Я вытащил фабричный метод, поместил его в свой собственный файл (в моем основном приложении, а не в моей библиотеке Animals). Наличие статического фабричного метода казалось милым и умным, но я понял, что на самом деле он не решает никаких проблем проектирования.
Я понятия не имею, как это относится к идиоматическому C #, так как я часто переключаю языки, я обычно игнорирую идиомы и соглашения, свойственные языкам, и стеки разработчика вне моей обычной работы. Во всяком случае, мой C # может выглядеть "питоническим", если это имеет смысл. Я стремлюсь к общей ясности.
Кроме того, я не знаю, было бы преимущество использования метода статической фабрики в случае небольших, простых классов, которые вряд ли будут расширены в будущей работе - в некоторых случаях было бы неплохо иметь все это в одном исходном файле.