Fabryka jest jednym z bardziej fundamentalnych wzorców projektowych. Dlatego też jest drugim w zestawieniu omawianym wzorcem. W najprostszym podejściu Fabryka służy do wytwarzania obiektów, stąd też nazwa wzorca. Zasadą ideologiczną zaś jest odseparowanie części odpowiedzialnej za tworzenie obiektów od celów funkcjonalnych danej klasy.

Rodzaje fabryk…

W zależności od specyfiki problemu możemy spróbować dopasować wzorzec do niego i użyć takiej jego wariacji, aby jak najlepiej odpowiadał naszym wyzwaniom wytwórczym. The Gang of Four w swoich sugestiach wymienia dwa wzorce oparte na Fabryce i są to wymienione poniżej jako główne, ale są też warianty wzorca Factory tworzące podwzorce, tj.:

  • Simple Factory, i w tym:
    • Factory Method (metoda wytwórcza)
    • Static Factory
  • Abstract Factory

W pierwszej opcji zostały wyróżnione dwa dodatkowe wyspecyfikowania wzorca Factory jako podwzorce, dlatego, bo są one de facto rozszerzeniem wzorca podstawowego Factory. Drugi jest uogólnieniem wzorca Factory umożliwiając wykorzystanie go masowo dla seryjnego tworzenia podobnych w strukturze grup klas i obiektów.

Jak wynika z powyższego wzorzec Faktory opisuje po prostu sposób na unifikację klas i tworzenie w uporządkowanym trybie nowych instancji klas, które de facto mogą się różnić implementacją, ale nie wywołaniem.

Przyjmijmy za przykład meble. Jest wiele rodzajów mebli, różniących się charakterystycznymi dla nich cechami jak np. łóżko i stół kuchenny, czy też szafka pod zlew. Wszystkie one posiadają jednakże także cechy wspólne np. zajętość podłogi (zajmowaną powierzchnię), wszystkie są też po prostu meblem.

Patrząc na powyższe założenie możemy zatem zdefiniować klasę Mebel opisującą pewne niezaprzeczalne cechy jakie mebel posiadać powinien np. rozmiar, waga, powierzchnia, rodzaj mebla… a nawet jego identyfikator, jeśli myślimy o programie do projektowania wnętrz. Teraz wiemy także, że każdy z tych mebli w zależności od jego rodzaju może mieć specyficzne cechy jak np. lodówka potrzebuje zasilania, a szafka pod zlew z reguły stawiana jest w miejscu gdzie znajdują się dopływ i odpływ wody.

package wzorceprojektowe1;

/**
 *
 * @author Utracki
 */
public class FactoryService {
//Mebel
    String nazwa_mebla;
    Rodzaj rodzaj;
    int rozmiarX, rozmiarY, rozmiarZ;
    int waga;
    enum Rodzaj {szafka30, szafka40, szafka80, lodówka, pralka};

public boolean createMebel(Rodzaj rodzaj) {
    switch (rodzaj) {
        case szafka30:    return this._createSzafka(30);
        case szafka40:    return this._createSzafka(40);
        case lodówka:   return this._createLodówka();
        // ...
        default :throw new Error("Brak wzorca");
    
    }
}
    
private boolean _createSzafka(int szer) {
rozmiarX=szer;rozmiarY=50;rozmiarZ=55;
nazwa_mebla="szafka";
// skonfiguruj cechy szafki, jeśli nie podajesz danych inicjalizacyjnych... odpytaj użytkownika
return true;
}

private boolean _createLodówka() {
rozmiarX=50;rozmiarY=55;rozmiarZ=200;
nazwa_mebla="lodówka";
//skonfiguruj cechy lodówki, jeśli nie podajesz danych inicjalizacyjnych... odpytaj użytkownika
return true;    
}

}

Teraz aby użyć tak skonstruowanej klasy…

package wzorceprojektowe1;



public class WzorceProjektowe1 {

    
    public static void main(String[] args) {
    
        FactoryService fs=new FactoryService();
              
        fs.createMebel(FactoryService.Rodzaj.lodówka);
        
        System.out.println(fs.nazwa_mebla);
}

        

Zadanie: Skonstruuj pełną klasę proponowanych mebli, zaimplementuj niezbędne parametry i cechy. W programie głównym stwórz listę mebli znajdujących się w danym pomieszczeniu. Zaimplementuj wydruk tej listy z danymi szczegółowymi i uproszczony tylko z nazwą mebla.

W następnym temacie omówione zostaną warianty Wzorca Factory: