Fabryka abstrakcyjna jest kreacyjnym wzorcem projektowym, który pozwala tworzyć rodziny spokrewnionych ze sobą obiektów bez określania ich konkretnych klas.
Fabryka abstrakcyjna definiuje interfejs służący tworzeniu poszczególnych produktów, ale pozostawia faktyczne tworzenie produktów konkretnym klasom fabrycznym. Każdy typ fabryki odpowiada jednemu z wariantów produktu.
Kod klienta wywołuje metody kreacyjne obiektu fabrycznego zamiast tworzyć produkty bezpośrednio — wywołując konstruktor (za pomocą operatora new). Skoro dana fabryka odpowiada jednemu z wariantów produktu, to wszystkie jej produkty będą ze sobą kompatybilne.
Kod klienta współpracuje z fabrykami i produktami wyłącznie poprzez ich abstrakcyjne interfejsy. Dzięki temu jeden klient jest kompatybilny z wieloma różnymi produktami. Wystarczy stworzyć nową konkretną klasę fabryczną i przekazać ją kodowi klienta.
Jeśli masz problem ze zrozumieniem różnicy pomiędzy poszczególnymi koncepcjami i wzorcami wytwórczymi, przeczytaj nasze Porównanie fabryk.
Przykłady użycia: Wzorzec Fabryka abstrakcyjna jest dość powszechnie stosowany w kodzie Java. Wiele frameworków i bibliotek dzięki niemu pozwala rozszerzać i dostosowywać swoje standardowe komponenty.
Oto przykłady użycia wzorca w głównych bibliotekach Java:
Identyfikacja: Wzorzec łatwo można rozpoznać na podstawie metod które zwracają obiekty fabryczne, służące następnie tworzeniu konkretnych pod-komponentów.
Rodziny międzyplatformowych komponentów graficznego interfejsu użytkownika (GUI) i ich wytwarzanie
W tym przykładzie przyciski i pola wyboru posłużą za produkty. Mamy dwa warianty: kontrolki w stylu macOS oraz Windows.
Fabryka abstrakcyjna definiuje interfejs mający służyć tworzeniu przycisków oraz pól wyboru. Są dwie konkretne fabryki, z których każda zwraca produkty w jednym z wariantów.
Kod klienta współpracuje z fabrykami i produktami za pośrednictwem abstrakcyjnych interfejsów. Pozwala to jednemu klientowi współdziałać z wieloma wariantami produktu — zależnie od typu obiektu fabrycznego.