W rzeczywistości, jeśli chcesz uzyskać korzyści z klasy fabrycznej, potrzebujesz statycznej metody w swojej klasie. Umożliwi to później tworzenie nowych klas fabrycznych lub rekonfigurowanie istniejącego, aby uzyskać różne zachowania. Na przykład jedna klasa fabryczna może tworzyć jednorożce, które implementują interfejs IFourHoovedAnimal. Możesz mieć napisany algorytm, który robi rzeczy z IFourHoovedAnimal i musi je utworzyć. Później możesz utworzyć nową klasę fabryczną, która zamiast tego tworzy instancje Pegasusa, które również implementują IFourHoovedAnimal. Stary algorytm można teraz ponownie wykorzystać dla Pegaza za pomocą nowej fabryki! Aby było to możliwe, zarówno PegasusFactory, jak i UnicornFactory muszą dziedziczyć po wspólnej klasie bazowej (zazwyczaj klasie abstrakcyjnej).
Widzisz, umieszczając metodę statyczną w jej własnej klasie fabrycznej, możesz zamienić klasy fabryczne na nowsze, aby ponownie użyć starych algorytmów. Działa to również w celu poprawy testowalności, ponieważ teraz testy jednostkowe mogą być karmione fabryką, która tworzy symulowane obiekty.
Zrobiłem to wcześniej (statyczna metoda fabryczna dla klasy, w której tworzysz instancje) dla bardzo małych projektów, ale tylko dlatego, że potrzebowałem go, aby pomóc w refaktoryzacji starego kodu, ale zachowaj zmiany do minimum . Zasadniczo w tym przypadku wyodrębniłem fragment kodu, który utworzył grupę kontrolek ASP.NET, i wprowadził wszystkie te kontrolki do formantu użytkownika. Chciałem, aby moja własność nowej kontroli użytkownika była oparta, ale starszemu starszemu kodowi łatwiej było stworzyć kontrolę użytkownika za pomocą konstruktora opartego na parametrach.
Tak więc stworzyłem statyczną metodę fabryczną, która pobierała wszystkie parametry, a następnie zainicjowała kontrolę użytkownika i ustawiła jego właściwości na podstawie parametrów. Stary kod starszego typu użył tej statycznej metody do utworzenia kontroli użytkownika, a przyszły kod użyłby zamiast tego "ładniejszych" właściwości.
Dlaczego jest to łatwiejsze do testowania z metodą non-statycznej? –
@ elwizowane elysium: na przykład klasa testowa może zawierać podklasę oryginału, która przesłoniła metodę, dla instrumentacji lub zwarcia normalnego zachowania. To nie jest (łatwo) możliwe dzięki statycznej metodzie. –
@ vvoured elysium - Ponieważ nie można przekazać klasy statycznej jako parametru do metod testowych (przynajmniej nie za dobrze). Jest to związane z drugim punktem dotyczącym iniekcji zależności. Ale, jak powiedział Jaxidian, te punkty mogą nie być ważne. –