Abstract Factory dla rodzin produktów
Twórz rodziny powiązanych obiektów, na przykład komponentów interfejsu użytkownika dla różnych platform, za pomocą Abstract Factory.
Abstract Factory dla rodzin produktów to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 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 Abstract Factory
Abstract Factory udostępnia interfejs do tworzenia rodzin powiązanych obiektów bez określania ich konkretnych klas. Gwarantuje zgodność produktów pochodzących z jednej fabryki.
Problem: niespójne rodziny produktów
Bez Abstract Factory można połączyć na przykład przycisk systemu Windows z polem wyboru systemu Mac. Wzorzec wymusza, aby wszystkie produkty pochodziły z tej samej fabryki, zapewniając spójność wizualną lub behawioralną.
Interfejs Abstract Factory
Należy zdefiniować interfejs z metodą tworzącą dla każdego produktu należącego do rodziny. Każda konkretna fabryka implementuje wszystkie metody dla jednego wariantu.
public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
TextField createTextField();
}Konkretne fabryki
Każda konkretna fabryka tworzy wszystkie produkty dla jednej platformy lub motywu. Kod klienta odwołuje się wyłącznie do interfejsu, a nie do konkretnych fabryk.
public class WindowsUIFactory implements UIFactory {
public Button createButton() { return new WindowsButton(); }
public Checkbox createCheckbox() { return new WindowsCheckbox(); }
public TextField createTextField() { return new WindowsTextField(); }
}
public class MacUIFactory implements UIFactory {
public Button createButton() { return new MacButton(); }
public Checkbox createCheckbox() { return new MacCheckbox(); }
public TextField createTextField() { return new MacTextField(); }
}Abstrakcyjne interfejsy produktów
Każdy typ produktu ma własny interfejs. Konkretne produkty implementują go dla poszczególnych platform. Kod klienta korzysta z abstrakcyjnego produktu, a nie z produktu konkretnego.
public interface Button { void render(); void onClick(); }
public interface Checkbox { void render(); boolean isChecked(); }
public interface TextField { void render(); String getValue(); }Klient korzystający z fabryki
Klient otrzymuje fabrykę za pośrednictwem konstruktora. Wywołuje metody fabryki, aby tworzyć widżety, i korzysta z nich za pośrednictwem abstrakcyjnych interfejsów produktów — pozostając całkowicie niezależnym od klas konkretnych.
public class Application {
private final UIFactory factory;
public Application(UIFactory factory) { this.factory = factory; }
public void buildUI() {
Button btn = factory.createButton();
Checkbox cb = factory.createCheckbox();
btn.render();
cb.render();
}
}Wybór fabryki w czasie działania
Należy wybrać konkretną fabrykę na podstawie środowiska lub konfiguracji, a następnie ją wstrzyknąć. Pozostała część aplikacji nigdy nie odwołuje się do klas specyficznych dla platformy.
String os = System.getProperty("os.name").toLowerCase();
UIFactory factory = os.contains("mac") ? new MacUIFactory() : new WindowsUIFactory();
new Application(factory).buildUI();Dodawanie nowego produktu do rodziny
Dodanie nowego produktu (np. Slider) wymaga zaktualizowania interfejsu abstrakcyjnej fabryki oraz wszystkich konkretnych fabryk — jest to wada tego wzorca.
public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
Slider createSlider(); // new product — must update ALL factories
}Abstract Factory a Factory Method
Factory Method tworzy jeden produkt za pomocą dziedziczenia. Abstract Factory tworzy zestaw produktów za pomocą kompozycji. Abstract Factory jest zazwyczaj implementowany przy użyciu zestawu metod fabrykujących.
Abstract Factory dla sterowników baz danych
Abstrakcyjna fabryka ConnectionFactory może tworzyć obiekty Connection, Statement i ResultSet. Aby przełączyć się między MySQL i PostgreSQL, wystarczy zmienić fabrykę.
public interface DBFactory {
Connection createConnection();
Statement createStatement();
}
public class MySQLFactory implements DBFactory { ... }
public class PgFactory implements DBFactory { ... }Abstract Factory z profilami Spring
W Spring Boot należy zdefiniować komponent UIFactory w różny sposób dla poszczególnych profili: aplikacja zawsze wstrzykuje UIFactory, a Spring wybiera właściwą konkretną fabrykę dla aktywnego profilu.
@Configuration
@Profile("mac")
public class MacConfig {
@Bean UIFactory uiFactory() { return new MacUIFactory(); }
}Zapewnianie spójności
Najważniejsza korzyść jest następująca: fabryka tworzy wyłącznie zgodne ze sobą produkty. Przy prawidłowym użyciu Abstract Factory nie można przypadkowo otrzymać pola wyboru systemu Mac połączonego z przyciskiem systemu Windows.
Szybki test
Co gwarantuje Abstract Factory, a czego nie gwarantuje Factory Method?
Podsumowanie
Abstract Factory tworzy rodziny powiązanych obiektów za pośrednictwem wspólnego interfejsu. Całe rodziny produktów można zamieniać, zmieniając fabrykę. Wzorzec najlepiej sprawdza się, gdy produkty muszą być spójne, ale zwiększa nakład pracy przy dodawaniu nowych typów produktów.
Często zadawane pytania
Czy lekcja „Abstract Factory dla rodzin produktów” jest bezpłatna?
Tak — pełny tekst „Abstract Factory dla rodzin produktów” 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 „Abstract Factory dla rodzin produktów”?
Twórz rodziny powiązanych obiektów, na przykład komponentów interfejsu użytkownika dla różnych platform, za pomocą Abstract Factory. Ć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 3 z 4.
Ile czasu zajmuje lekcja „Abstract Factory dla rodzin produktów”?
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