Przejdź do treści

Wzorzec projektowy fabryka

Factory
  • przez

Wzorce projektowe są kluczowym elementem w dziedzinie inżynierii oprogramowania, pomagając programistom w rozwiązaniu powtarzalnych problemów projektowych. Jednym z tych wzorców jest Fabryka (ang. Factory), który skupia się na abstrakcji procesu tworzenia obiektów. W artykule tym omówimy, dlaczego wzorzec Fabryka jest użyteczny, jak działa oraz zaprezentujemy prosty przykład implementacji w języku programowania.

Dlaczego Fabryka?

W projektowaniu oprogramowania często zetknięci jesteśmy z koniecznością tworzenia obiektów różnych klas, które implementują tę samą interfejs lub dziedziczą po wspólnej klasie bazowej. W tym kontekście wzorzec Fabryka staje się niezwykle przydatny. Jego głównym celem jest dostarczenie jednego interfejsu do tworzenia obiektów, nie specyfikując dokładnie ich klas. W ten sposób, programista może zmieniać typ tworzonego obiektu bez zmiany reszty kodu.

Jak działa Fabryka?

Wzorzec Fabryka skupia się na separacji procesu tworzenia obiektu od reszty kodu. W skrócie, tworzymy interfejs fabryki, który definiuje metodę do tworzenia obiektów, a następnie każda konkretna fabryka implementuje tę metodę, dostarczając konkretne instancje obiektów.

Przykład Implementacji

W tym przykładzie, interfejs VehicleFactory zawiera jedną metodę createVehicle(), która jest implementowana przez konkretne fabryki (CarFactory i MotorcycleFactory). Każda fabryka jest odpowiedzialna za tworzenie jednego rodzaju obiektu (samochodu lub motocykla).

Interfejs Vehicle definiuje metodę drive(), którą implementują konkretne produkty (Car i Motorcycle). Klient (Client class) używa fabryk do uzyskania obiektów i następnie wywołuje na nich metodę drive().

// Interfejs Fabryki
interface VehicleFactory {
    Vehicle createVehicle();
}

// Interfejs Produktu
interface Vehicle {
    String drive();
}

// Konkretne fabryki
class CarFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
}

class MotorcycleFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Motorcycle();
    }
}

// Konkretne produkty
class Car implements Vehicle {
    @Override
    public String drive() {
        return "Driving a car";
    }
}

class Motorcycle implements Vehicle {
    @Override
    public String drive() {
        return "Riding a motorcycle";
    }
}

// Klient
public class Client {
    public static void main(String[] args) {
        // Użycie fabryk do tworzenia obiektów
        VehicleFactory carFactory = new CarFactory();
        VehicleFactory motorcycleFactory = new MotorcycleFactory();

        // Uzyskanie obiektów poprzez fabryki
        Vehicle car = carFactory.createVehicle();
        Vehicle motorcycle = motorcycleFactory.createVehicle();

        // Wywołanie metody drive() na obiektach
        System.out.println(car.drive());              // "Driving a car"
        System.out.println(motorcycle.drive());       // "Riding a motorcycle"
    }
}