Mit dem Abstract Factory Pattern erzeugt man Familien verwandter oder voneinander abhängiger Objekte, ohne ihre konkreten Klassen zu benennen.
Diese Übung soll anhand einer Vorlage aufzeigen, wie das Abstract Factory Pattern anzuwenden ist. Aus Ausgangslage dient uns eine bestehende Applikation VehiclePlace, welche das Factory Pattern implementiert, aber keine Abstract Factory. Die Vorlage implementiert das folgende Klassendiagramm:
Die Applikation vermietet Fahrzeuge (Vehicles). Pro Art des Fahrzeuges ist eine Klasse (Car, Bike, Boat, ..) zugeordnet. Diese implementieren das Interface IVehicle.
Das IVehicle Interface definiert Methoden für den Beginn (startRent()) und das Ende (stopRent()) einer Ausleihe des betroffenen Fahrzeuges. Die Methoden set/getMax() verwalten die maximale Anzahl der zu vermietenden Vehicles. Die Methode getAvailable() gibt die zur Zeit freien Vehicles und somit mietbaren Fahrzeuge zurück.
Die Klasse VehiclePlace verwaltet alle vermietbaren Objekte (Vehicles).Diese Klasse hat nur eine Beziehung zum Interface IVehicle und kennt keine speziellen Vehicles. Diese Klasse kann auch keine neuen Vehicles instanziieren.
Die Klasse VehicleFactory ist die einzige Klasse, die alle möglichen Vehicles kennt und instanziieren kann. Die Klasse stellt sicher, dass vom gleichen Typ nur genau eine Instanz vorhanden ist.
Die Vorlage arbeitet mit der Klasse VehiclePlaceApp, welche eine in der Methode main(...) einen VehiclePlace installiert und über die VehicleFactory instanziiert. Das folgende Listing zeigt den Code der Methode main(...) auf:
public class VehiclePlaceApp {
public static void main(String[] args) {
VehiclePlace vp = new VehiclePlace();
// init vehicle place
IVehicle car = VehicleFactory.instance("Car", 2);
vp.add(car);
IVehicle boat = VehicleFactory.instance("Boat", 5);
vp.add(boat);
IVehicle bike = VehicleFactory.instance("Bike", 10);
vp.add(bike);
// lets rent
try {
vp.startRent(bike);
vp.startRent(boat);
vp.startRent(car);
vp.stopRent(bike);
vp.stopRent(boat);
vp.stopRent(car);
} catch (Exception e) {
System.out.println(e);
}
// lets rent a bike
try {
vp.startRent(car);
vp.startRent(car);
vp.startRent(car);
} catch (Exception e) {
System.out.println(e);
}
}
}
Die Applikation ergibt den folgenden Output: start renting a bike
start renting a boat
start renting a car
stop renting a bike
stop renting a boat
stop renting a car
start renting a car
start renting a car
ch.std.jdpp.abstractfactory.VehicleException: no vehicle available for rent