Metoda wytwórcza (ang. Factory method) (wzorzec kreacyjny) umożliwia tworzenie obiektów o wspólnym typie poprzez dostarczenie interfejsu do tworzenia nieokreślonych instancji jednego typu. Zatem fabryki FactoryMetody wytwórczej są ściśle związane z produktami jednego abstrakcyjnego typu Product. Na podstawie przekazanych argumentów bądź innych warunków zależnych od implementacji fabryki, tworzy ona egzemplarz konkretnego typu. Dzięki temu centralizuje oraz hermetyzuje się proces tworzenia obiektów co ułatwia wprowadzanie zmian w istniejącym kodzie. Dodatkowo niweluje zależnosci między implementacją, a zastosowaniem produktu. Klient nie musi znać dokładnego typu produktu oraz wywołania konstruktora, cała odpowiedzialność spada na Metodę fabrykującą.
Ograniczenia
Wzorzec ten może wprowadzać zbyt duży poziom abstrakcji, tzn. klient nie wie z jakim obiektem współpracuje. Należy uważać, aby fabryka nie stała się super klasą (god object), a jej rola została ograniczona do generowania obiektów. Metoda wytwórcza może być nadużywana, należy zatem umieścić ją tam gdzie rzeczywiście przyniesie ona korzyści, a nie wprowadzi tylko dodatkowy poziom skomplikowania.
Użycie
Metoda wytwórcza jest stosowana tam gdzie pożądane jest ujednolicenie sposobu tworzenia obiektów danej rodziny oraz odcięcie klienta od szczegółów implementacji tworzenia obiektów. Ponadto dokładny typ obiektu nie musi być znany w trakcie tworzenia kodu, a decyzja o tym jaki obiekt zostanie wygenerowany zapada dynamicznie. Wzorzec ten warto użyć także, gdy klasa ma skomplikowany konstruktor.
Implementacja
Konkretna fabryka ProductFactory1 ma zadanie stworzyć obiekt pochodzący ze wspólnego typu. Realizuje to poprzez implementacje interfejsu fabryki danego typu produktów ProductFactory. Produkty Product1, Product2, itd muszą rozszerzać klasę bazową produktu dla której zostanie dedykowana fabryka ProductFactory.
Poniższy listing przedstawia implementacja wzorca Metoda wytwórcza dla produktów klasy Product.
Klient może skorzystać wygenerować produkty za pomocą fabryki w następujący sposób.
Przykład
Aplikacja Maps umożliwia przeglądanie na mapie listę punktów POI. Każdy z rodzajów POI jest przedstawiany na mapie jako ikona charakterystyczna dla danego typu. Ze względu na różnorodność typów POI, każdy z nich ma swój dedykowany widok szczegołów, który różni się szatą graficzną oraz przedstawianymi informacjami. Poniższy listing przedstawia implementacje generowania punktów POI za pomocą Metody wytwórczej.
Jedną z funckjonalności nowej wersji mapy jest wybór wyświetlanego trybu dziennego / nocnego, co wpływa na zmianę kolorystyki mapy oraz punktów POI. Wystarczy zatem dodać nowe typy Poi oraz nową implementację PoiFactory.
Komponent mapy aplikacji wykorzystuje Metodę wytwórczą do uzyskania listy punktów Poi w następujący sposób.
Biblioteki
Ze względu na specyfikację wzorca, implementacja Metody wytwórczej spoczywa na barkach programisty. Metodą getInstance klasy Calendar standardowego pakietu Java jest przykłądem realizacji wzorca.