Nützlich wenn man dynamisch Objekte von unterschiedlichen Typen erstellen will

Abstract Product: Dient als Datentyp für die Objekte und gibt als Superklasse die konkreten Produkte vor. Concrete Product: Erbt von Abstract Product und ist ein Produkt das die Factory erstellen kann. Factory: Bekommt in createProduct z.B. als String das gewünschte Produkt übergeben, und gibt ein Objekt davon zurück. Client: Das Programm das die Factory aufruft

Beispiel

abstract class AbstractProduct {
    public abstract String getType();
}
 
// Konkrete Produkte
class ConcreteProduct1 extends AbstractProduct {
    @Override
    public String getType() { return "Product1";}
}
 
class ConcreteProduct2 extends AbstractProduct {
    @Override
    public String getType() { return "Product2";}
}
 
// Factory
class Factory {
    public static AbstractProduct createProduct(String type) {
        if (type.equals("Product1")) {
            return new ConcreteProduct1();
        }else if (type.equals("Product2")) {
            return new ConcreteProduct2();
        }
        throw new IllegalArgumentException("Unknown Producttype: " + type);
    }
}
 
// Demo
public class Main {
    public static void main(String[] args) {
        AbstractProduct p1 = Factory.createProduct("Product1");
        System.out.println("Bestellt: " + p1.getType());
    }
}