In the Abstract Factory pattern, there are typically two levels of abstraction:
- Abstract Factory: This is an interface or an abstract class that declares a set of methods for creating abstract products. Each method corresponds to a different kind of product family. Concrete implementations of the abstract factory provide specific implementations for creating concrete products.
- Abstract Products: These are interfaces or abstract classes that declare a set of methods that concrete products must implement. Each abstract product represents a different kind of product in the family.
Factory Design pattern creates concrete class objects.
Abstract Factory Design Pattern creates factories that creates concrete class object.

public interface Car {
void drive();
}
public class EconomyCar implements Car {
@Override
public void drive() {
System.out.println("Driving an Economy car...");
}
}
public class LuxuryCar implements Car {
@Override
public void drive() {
System.out.println("Driving a luxury car...");
}
}
public interface Truck {
void drive();
}
public class EconomyTruck implements Truck {
@Override
public void drive() {
System.out.println("Driving an Economy truck...");
}
}
public class LuxuryTruck implements Truck {
@Override
public void drive() {
System.out.println("Driving a Luxury truck...");
}
}
public interface VehicleFactory {
Car createCar();
Truck createTruck();
}
public class EconomyVehicleFactory implements VehicleFactory {
@Override
public Car createCar() {
return new EconomyCar();
}
@Override
public Truck createTruck() {
return new EconomyTruck();
}
}
public class LuxuryVehicleFactory implements VehicleFactory {
@Override
public Car createCar() {
return new LuxuryCar();
}
@Override
public Truck createTruck() {
return new LuxuryTruck();
}
}
public class FactoryProducer {
public static VehicleFactory getFactory(String factoryType){
if(factoryType.equalsIgnoreCase("Economy")){
return new EconomyVehicleFactory();
} else if(factoryType.equalsIgnoreCase("Luxury")){
return new LuxuryVehicleFactory();
}
return null;
}
}
public class Main {
public static void main(String[] args) {
VehicleFactory factory1 = FactoryProducer.getFactory("Economy");
Car car1 = factory1.createCar();
car1.drive();
Truck truck1 = factory1.createTruck();
truck1.drive();
VehicleFactory factory2 = FactoryProducer.getFactory("Luxury");
Car car2 = factory2.createCar();
car2.drive();
Truck truck2 = factory2.createTruck();
truck2.drive();
}
}