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