To pytanie jest dla mnie aktualne - wczoraj pisałem prawie dokładnie taki kod. Po prostu zamień „Animal” na wszystko, co jest istotne w moim projekcie, chociaż pozostanę przy „Animal” w celu omówienia tutaj. Zamiast instrukcji „switch” miałem nieco bardziej złożoną serię instrukcji „if”, obejmującą więcej niż tylko porównanie jednej zmiennej z pewnymi ustalonymi wartościami. Ale to szczegół. Statyczna metoda fabryczna wydawała się zgrabnym sposobem projektowania rzeczy, ponieważ projekt powstał z refaktoryzacji wcześniejszych, szybkich i brudnych elementów kodu.
Odrzuciłem ten projekt ze względu na klasę podstawową mającą wiedzę o klasie pochodnej. Jeśli klasy LandAnimal i SeaAnimal są małe, czyste i łatwe, mogą znajdować się w tym samym pliku źródłowym. Ale mam duże niechlujne metody odczytu plików tekstowych niezgodnych z żadnymi oficjalnie zdefiniowanymi standardami - chcę, aby moja klasa LandAnimal miała własny plik źródłowy.
Prowadzi to do zależności plików cyklicznych - LandAnimal pochodzi od Animal, ale Animal musi już wiedzieć, że istnieje LandAnimal, SeaAnimal i piętnaście innych klas. Wyciągnąłem metodę fabryczną, umieściłem ją we własnym pliku (w mojej głównej aplikacji, a nie w bibliotece Animals) Posiadanie statycznej metody fabrycznej wydawało się urocze i sprytne, ale zdałem sobie sprawę, że tak naprawdę nie rozwiązało to żadnego problemu projektowego.
Nie mam pojęcia, jak to się ma do idiomatycznego C #, ponieważ często zmieniam języki, zwykle ignoruję idiomy i konwencje specyficzne dla języków i stosy deweloperów poza moją zwykłą pracą. Jeśli cokolwiek, mój C # może wyglądać „pytonicznie”, jeśli to ma sens. Dążę do ogólnej jasności.
Nie wiem też, czy przydałoby się stosowanie statycznej metody fabrycznej w przypadku małych, prostych klas, które raczej nie zostaną rozszerzone w przyszłości - posiadanie tego wszystkiego w jednym pliku źródłowym może być przyjemne w niektórych przypadkach.