Diese Frage ist für mich aktuell - ich habe gestern fast genau solchen Code geschrieben. Ersetzen Sie einfach "Animal" durch das, was in meinem Projekt relevant ist, obwohl ich hier zur Diskussion bei "Animal" bleiben werde. Anstelle einer switch-Anweisung hatte ich eine etwas komplexere Folge von if-Anweisungen, bei denen mehr als nur ein Vergleich einer Variablen mit bestimmten festen Werten durchgeführt wurde. Aber das ist ein Detail. Eine statische Factory-Methode schien ein guter Weg zu sein, um Dinge zu entwerfen, da das Design aus der Umgestaltung früherer schneller und schmutziger Code-Unordnung hervorgegangen ist.
Ich habe diesen Entwurf abgelehnt, weil die Basisklasse Kenntnis von der abgeleiteten Klasse hatte. Wenn die Klassen LandAnimal und SeaAnimal klein, übersichtlich und einfach sind, können sie sich in derselben Quelldatei befinden. Aber ich habe große Probleme beim Lesen von Textdateien, die nicht den offiziellen Standards entsprechen. Ich möchte, dass meine LandAnimal-Klasse in einer eigenen Quelldatei gespeichert wird.
Dies führt zu einer Abhängigkeit von zirkulären Dateien - LandAnimal wird von Animal abgeleitet, Animal muss jedoch bereits wissen, dass LandAnimal, SeaAnimal und fünfzehn weitere Klassen existieren. Ich habe die Factory-Methode rausgezogen und in eine eigene Datei geschrieben (in meiner Hauptanwendung, nicht in meiner Animals-Bibliothek). Eine statische Factory-Methode zu haben schien nett und clever zu sein, aber ich erkannte, dass sie eigentlich kein Designproblem löste.
Ich habe keine Ahnung, wie das mit idiomatischem C # zusammenhängt, da ich oft die Sprache wechsle, ignoriere ich normalerweise Redewendungen und Konventionen, die für Sprachen und Entwicklerstapel außerhalb meiner üblichen Arbeit typisch sind. Wenn überhaupt, könnte mein C # "pythonisch" aussehen, wenn das sinnvoll ist. Ich bemühe mich um allgemeine Klarheit.
Ich weiß auch nicht, ob die Verwendung der statischen Factory-Methode bei kleinen, einfachen Klassen von Vorteil ist, die in der Zukunft wahrscheinlich nicht erweitert werden. In einigen Fällen kann es hilfreich sein, alle Klassen in einer Quelldatei zu haben.