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.

Rys. 1 Diagram UML klas wzorca fabryka

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"
    }
}

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *