Wzorzec Factory Method
Zdefiniuj metodę fabrykującą w klasie bazowej i pozwól klasom pochodnym decydować, który produkt utworzyć.
Wzorzec Factory Method to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Cel wzorca Factory Method
Wzorzec Factory Method definiuje interfejs tworzenia obiektu, ale pozostawia podklasom decyzję, którą klasę należy zainstancjonować. Oddziela logikę tworzenia od kodu klienta.
Problem bez wzorca Factory Method
Bez fabryki kod klienta jest zaśmiecony wywołaniami new ConcreteClass(). Dodanie nowego wariantu oznacza zmianę w każdym miejscu wywołania — naruszenie zasady otwarte-zamknięte (Open/Closed Principle).
// Client knows too much:
Shape shape;
if (type.equals("circle")) shape = new Circle(r);
else if (type.equals("rect")) shape = new Rectangle(w, h);
// Every new shape requires editing this code.Abstrakcyjna klasa twórcy
Należy zdefiniować abstrakcyjną klasę twórcy z fabryczną metodą createProduct(). Podklasy przesłaniają ją, aby zwracać określone typy produktów.
public abstract class Dialog {
public void render() {
Button btn = createButton(); // factory method
btn.onClick();
}
protected abstract Button createButton();
}Konkretni twórcy
Każda podklasa przesłania metodę fabrykującą, aby zwracać odpowiedni produkt bez zmieniania otaczającego algorytmu w klasie bazowej.
public class WindowsDialog extends Dialog {
@Override
protected Button createButton() { return new WindowsButton(); }
}
public class WebDialog extends Dialog {
@Override
protected Button createButton() { return new HtmlButton(); }
}Interfejs produktu
Wszystkie konkretne produkty implementują wspólny interfejs, dzięki czemu twórca może korzystać z nich w sposób ogólny.
public interface Button {
void onClick();
void render();
}
public class WindowsButton implements Button {
public void onClick() { System.out.println("Windows click"); }
public void render() { System.out.println("Render Windows button"); }
}Statyczne metody fabrykujące a wzorzec Factory Method
Statyczna metoda fabrykująca (np. LocalDate.of()) to konwencja nazewnicza, a nie wzorzec GoF. Wzorzec GoF wykorzystuje dziedziczenie, natomiast fabryki statyczne — metody statyczne w jednej klasie.
// Static factory (NOT the GoF pattern)
LocalDate d = LocalDate.of(2024, 6, 15);
// GoF Factory Method uses a class hierarchyParametryzowana metoda fabrykująca
Przekazanie parametru do metody fabrykującej pozwala wybrać jeden z kilku produktów bez konieczności tworzenia osobnej podklasy dla każdego produktu.
public class ShapeFactory {
public static Shape create(String type, double... dims) {
return switch (type) {
case "circle" -> new Circle(dims[0]);
case "rectangle" -> new Rectangle(dims[0], dims[1]);
default -> throw new IllegalArgumentException("Unknown: " + type);
};
}
}Factory Method z typami generycznymi
Należy użyć typów generycznych, aby metoda fabrykująca była bezpieczna typowo i możliwa do ponownego wykorzystania w różnych rodzinach produktów.
public abstract class Repository<T, ID> {
public abstract T findById(ID id);
protected abstract T createEmpty(); // factory method
}Rejestrowanie fabryk za pomocą mapy
Fabryka oparta na rejestrze przechowuje mapę ciągów oznaczających typy i lambd Supplier, co pozwala uniknąć łańcuchów if-else i umożliwia dynamiczne rejestrowanie.
Map<String, Supplier<Notification>> registry = new HashMap<>();
registry.put("email", EmailNotification::new);
registry.put("sms", SmsNotification::new);
Notification n = registry.getOrDefault(type, DefaultNotification::new).get();Factory Method a Abstract Factory
Factory Method tworzy jeden typ produktu za pomocą dziedziczenia. Abstract Factory tworzy rodziny powiązanych produktów za pomocą kompozycji. Factory Method należy stosować, gdy zmienia się jeden produkt, a Abstract Factory — gdy cała rodzina zmienia się razem.
Przykład z praktyki: fabryka loggerów
LoggerFactory.getLogger(Class) w SLF4J to statyczna fabryka, która zwraca właściwą implementację loggera (Logback, Log4j, JUL), bez konieczności wiedzy po stronie wywołującego, z której implementacji korzysta.
Logger log = LoggerFactory.getLogger(MyService.class);
log.info("Service started");Szybki test
Jaka jest najważniejsza cecha wzorca Factory Method?
Podsumowanie
Factory Method oddziela tworzenie obiektów od klienta, umieszczając decyzję o instancjonowaniu w przesłanianych metodach podklas. Należy go stosować, gdy klasa nie może przewidzieć, jakie obiekty będzie musiała utworzyć.
Często zadawane pytania
Czy lekcja „Wzorzec Factory Method” jest bezpłatna?
Tak — pełny tekst „Wzorzec Factory Method” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorzec Factory Method”?
Zdefiniuj metodę fabrykującą w klasie bazowej i pozwól klasom pochodnym decydować, który produkt utworzyć. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wzorzec Factory Method”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Singleton: implementacje bezpieczne wątkowo
- Wzorzec Factory Method
- Abstract Factory dla rodzin produktów
- Wzorzec Builder z płynnym API