0Pricing
Java Academy · Lekcja

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 hierarchy

Parametryzowana 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

  1. Singleton: implementacje bezpieczne wątkowo
  2. Wzorzec Factory Method
  3. Abstract Factory dla rodzin produktów
  4. Wzorzec Builder z płynnym API
← Powrót do Java Academy