Simple Factory (Prosta fabryka) nie jest przez wszystkich uważany za wzorzec projektowy. Jednak jest tak często używany, że warty odrobiny uwagi. Simple factory jest jednym z wzorców konstrukcyjnych, których zadaniem jest tworzenie obiektów. Wzorzec ten charakteryzuje się tym, że caly proces decyzyjny i konstrukcyjny jest w jednej metodzie. Dla przykładu mamy klasy kilku napojów: Kawa, Herbata, Wino, Piwo i Woda. Wszystkie implementują interface Napój. Klasa NapójFactory utworzony zgodnie z powyższym wzorcem może wyglądać tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class SimpleFactory { Napoje napoj; public Napoje createNapoj(String name) { if (name.equalsIgnoreCase("wino")) { return new Wino(); } else if (name.equalsIgnoreCase("piwo")) { return new Piwo(); } else if (name.equalsIgnoreCase("kawa")) { return new Kawa(); } return new Woda(); } } |
Metoda createNapoj
to właśnie simple factory. Tworzy nową klasę interfejsu Napoje na podstawie dostarczonego parametru. Nie jest to najlepszy sposób na przenoszenie parametrów, poniważ zwykła literówka może uczynić z naszego wina wodę :D. Dlatego też dobrym nawykiem jest korzystanie w takich przypadkach z Enum.
1 2 3 4 5 6 7 8 9 |
public enum NapojeEnum { PIWO, WINO, WODA, KAWA } |
Wtedy nasza klasa fabrykująca może będzie wyglądać tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class SimpleFactory { Napoje napoje; public Napoje createNapoj(NapojeEnum ne) { switch (ne) { case PIWO: { return new Piwo(); } case WINO: { return new Wino(); } case KAWA: { return new Kawa(); } default: { return new Woda(); } } } } |
Teraz gdy potrzebujemy jakiś napój tworzymy go w ten sposób:
1 2 3 4 5 6 7 |
public class Barman { SimpleFactory napojeFactory = new SimpleFactory(); Napoje kawa = napojeFactory.createNapoj(NapojeEnum.KAWA); } |
Gdy metodę createNapoj
zrobimy statyczną to nie musimy tworzyć instancji klasy SimpleFactory aby stworzyć klasę typu Napoje
.