Це питання для мене своєчасне - я писав майже саме такий код вчора. Просто замініть "Animal" на те, що є релевантним для мого проекту, хоча я дотримуватись "Animal" заради обговорення тут. Замість заяви «switch» у мене був дещо складніший ряд висловлювань «if», що передбачав більше, ніж просто порівняння однієї змінної з певними фіксованими значеннями. Але це деталь. Статичний заводський метод видався акуратним способом проектування речей, оскільки конструкція виникла з рефакторингу раніше швидких і брудних помилок коду.
Я відхилив цю конструкцію на підставі того, що базовий клас має знання похідного класу. Якщо класи LandAnimal та SeaAnimal невеликі, акуратні та прості, вони можуть бути в одному вихідному файлі. Але у мене є великі безладні методи для читання текстових файлів, які не відповідають жодному офіційно визначеному стандарту - я хочу, щоб мій клас LandAnimal був у своєму власному вихідному файлі.
Це призводить до кругової залежності файлів - LandAnimal походить від Animal, але Animal вже повинен знати, що існують LandAnimal, SeaAnimal та п’ятнадцять інших класів. Я витягнув заводський метод, вклав його у свій власний файл (у моєму головному додатку, а не в моїй бібліотеці тварин). Статичний заводський метод здався милим і розумним, але я зрозумів, що він насправді не вирішує жодної проблеми дизайну.
Я поняття не маю, як це стосується ідіоматичного C #, оскільки я дуже перемикаю мови, я зазвичай ігнорую ідіоми та умовності, властиві мовам та стекам розробників поза моєю звичайною роботою. Якщо щось моє C # може виглядати "пітонічним", якщо це має сенс. Я прагну загальної ясності.
Крім того, я не знаю, чи не було б переваги використовувати статичний заводський метод у випадку невеликих, простих класів, які навряд чи будуть розширені в майбутній роботі - мати це все в одному вихідному файлі може бути непогано в деяких випадках.