Wzorzec Factory method (Metoda fabrykująca) jest kolejnym wzorce konstrukcyjnym. Wzorzec ten wykorzystywany jest w sytuacjach, gdy potrzebujemy utworzyć obiekt z poszczególnej grupy ( połączonej wspólnym interfejsem). Dodatkowo potrzebujemy klasy, która zajęłaby się implementacją poszczzególnych metod interfejsu i metody w większości przypadków będą niezmienne dla więkoszości klas. Do uzyskania zamierzonego efektu klasa odpowiedzialna za tworzenie metod została utworzona jako abstrakcyjna. Zawarto w niej wszystkie metody obsługujące potrzebny obiekt, a metodę która tworzy obiekt przeniesiono poziom niżej do poszczególnych podklas tej klasy.
Dla przykładu: posiadamy intefejs Napoje i klasy go implementujące: Kawa, Wino, Woda i Piwo. Czyli dokładnie ten sam model, który wykorzystaliśmy przy opisie wzorca Simple Factory.
Musimy utworzyć klasę abstrakcyjną która obsłuży nasze drinki:
1 2 3 4 5 6 7 8 9 10 11 |
public abstract class Drinkomat { Napoje napoj; protected abstract Napoje createNapoj(); public void przygotujNapoj() { napoj = createNapoj(); //dodaj dodatki, wlej do odpowiedniego szkła } // inne operacje na napoju .... } |
Konstruowanie poszczególnego rodzaju napoju przenosimy do klasy dziedziczącej z tego interfejsu, np.
1 2 3 4 5 6 7 8 9 10 11 |
public class AutomatDoKawy extends Drinkomat { @Override protected Napoje createNapoj() { return new Kawa(); } } |
Dzięki factory method, Klasa Barman może obslugiwać poszczególne napoje nie wiedząc, który napój będzie utworzony.
1 2 3 4 5 6 7 |
public class Barman { public void podajNapoj(Drinkomat drink) { drink.przygotujNapoj(); } } |
Schemat wzorca wygląda tak: