Knowledge Guide
HomeOO & Low-Level DesignOO Design Problems

Design a Car Rental System

Let's design a car rental system where customers can rent vehicles.

A Car Rental System is a software built to handle the renting of automobiles for a short period of time, generally ranging from a few hours to a few weeks. A car rental system often has numerous local branches (to allow its user to return a vehicle to a different location), and primarily located near airports or busy city areas.

Image
Image

System Requirements

We will focus on the following set of requirements while designing our Car Rental System:

  1. The system will support the renting of different automobiles like cars, trucks, SUVs, vans, and motorcycles.

  2. Each vehicle should be added with a unique barcode and other details, including a parking stall number which helps to locate the vehicle.

  3. The system should be able to retrieve information like which member took a particular vehicle or what vehicles have been rented out by a specific member.

  4. The system should collect a late-fee for vehicles returned after the due date.

  5. Members should be able to search the vehicle inventory and reserve any available vehicle.

  6. The system should be able to send notifications whenever the reservation is approaching the pick-up date, as well as when the vehicle is nearing the due date or has not been returned within the due date.

  7. The system will be able to read barcodes from vehicles.

  8. Members should be able to cancel their reservations.

  9. The system should maintain a vehicle log to track all events related to the vehicles.

  10. Members can add rental insurance to their reservation.

  11. Members can rent additional equipment, like navigation, child seat, ski rack, etc.

  12. Members can add additional services to their reservation, such as roadside assistance, additional driver, wifi, etc.

Use case diagram

We have four main Actors in our system:

Here are the top use cases of the Car Rental System:

Image
Image

Class diagram

Here are the main classes of our Car Rental System:

Image
Image
Image
Image

Activity diagrams

Pick up a vehicle: Any member can perform this activity. Here are the steps to pick up a vehicle:

Image
Image

Return a vehicle: Any worker can perform this activity. While returning a vehicle, the system must collect a late fee from the member if the return date is after the due date. Here are the steps for returning a vehicle:

Image
Image

Code

Here is the high-level definition for the classes described above.

Enums, data types and constants: Here are the required enums, data types, and constants:

java
public enum BillItemType {
    BASE_CHARGE, ADDITIONAL_SERVICE, FINE, OTHER
}

public enum VehicleLogType {
    ACCIDENT, FUELING, CLEANING_SERVICE, OIL_CHANGE, REPAIR, OTHER
}

public enum VanType {
    PASSENGER, CARGO
}

public enum CarType {
    ECONOMY, COMPACT, INTERMEDIATE, STANDARD, FULL_SIZE, PREMIUM, LUXURY
}

public enum VehicleStatus {
    AVAILABLE, RESERVED, LOANED, LOST, BEING_SERVICED, OTHER
}

public enum ReservationStatus {
    ACTIVE, PENDING, CONFIRMED, COMPLETED, CANCELLED, NONE
}

public enum AccountStatus {
    ACTIVE, CLOSED, CANCELED, BLACKLISTED, BLOCKED
}

public enum PaymentStatus {
    UNPAID, PENDING, COMPLETED, FILLED, DECLINED, CANCELLED, ABANDONED, SETTLING, SETTLED, REFUNDED
}

public class Address {
    private String streetAddress;
    private String city;
    private String state;
    private String zipCode;
    private String country;
}

public class Person {
    private String name;
    private Address address;
    private String email;
    private String phone;
}

Account, Member, Receptionist, and Additional Driver: These classes represent different people that interact with our system:

java
// For simplicity, we are not defining getter and setter functions. The reader can
// assume that all class attributes are private and accessed through their respective
// public getter method and modified only through their public setter method.

public abstract class Account {
    private String id;
    private String password;
    private AccountStatus status;
    private Person person;

    public boolean resetPassword();
}

public class Member extends Account {
    private int totalVehiclesReserved;

    public List<VehicleReservation> getReservations();
}

public class Receptionist extends Account {
    private Date dateJoined;

    public List<Member> searchMember(String name);
}

public class AdditionalDriver {
    private String driverID;
    private Person person;
}

CarRentalSystem and CarRentalLocation: These classes represent the top level classes:

java
public class CarRentalLocation {
    private String name;
    private Address location;

    public Address getLocation();
}

public class CarRentalSystem {
    private String name;
    private List<CarRentalLocation> locations;

    public boolean addNewLocation(CarRentalLocation location);
}

Vehicle, VehicleLog, and VehicleReservation: To encapsulate a vehicle, log, and reservation. The VehicleReservation class will be responsible for processing the reservation and return of a vehicle:

java
public abstract class Vehicle {
    private String licenseNumber;
    private String stockNumber;
    private int passengerCapacity;
    private String barcode;
    private boolean hasSunroof;
    private VehicleStatus status;
    private String model;
    private String make;
    private int manufacturingYear;
    private int mileage;

    private List<VehicleLog> log;

    public boolean reserveVehicle();

    public boolean returnVehicle();
}

public class Car extends Vehicle {
    private CarType type;
}

public class Van extends Vehicle {
    private VanType type;
}

public class Truck extends Vehicle {
    private String type;
}

// We can have similar definition for other vehicle types

// ...

public class VehicleLog {
    private String id;
    private VehicleLogType type;
    private String description;
    private Date creationDate;

    public bool update();

    public List<VehicleLogType> searchByLogType(VehicleLogType type);
}

public class VehicleReservation {
    private String reservationNumber;
    private Date creationDate;
    private ReservationStatus status;
    private Date dueDate;
    private Date returnDate;
    private String pickupLocationName;
    private String returnLocationName;

    private int customerID;
    private Vehicle vehicle;
    private Bill bill;
    private List<AdditionalDriver> additionalDrivers;
    private List<Notification> notifications;
    private List<RentalInsurance> insurances;
    private List<Equipment> equipments;
    private List<Service> services;

    public static VehicleReservation fetchReservationDetails(String reservationNumber);

    public List<Passenger> getAdditionalDrivers();
}

VehicleInventory and Search: VehicleInventory will implement an interface 'Search' to facilitate the searching of vehicles:

java
public interface Search {
    public List<Vehicle> searchByType(String type);

    public List<Vehicle> searchByModel(String model);
}

public class VehicleInventory implements Search {
    private HashMap<String, List<Vehicle>> vehicleTypes;
    private HashMap<String, List<Vehicle>> vehicleModels;

    public List<Vehicle> searchByType(String query) {
        // return all vehicles of the given type.
        return vehicleTypes.get(query);
    }

    public List<Vehicle> searchByModel(String query) {
        // return all vehicles of the given model.
        return vehicleModels.get(query);
    }
}
🤖 Don't fully get this? Learn it with Claude

Stuck on Design a Car Rental System? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🎨 Explain it visually

Build the mental picture, not memorization.

I just read a lesson on **Design a Car Rental System** (OO & Low-Level Design) and want to truly understand it. Explain Design a Car Rental System from first principles using ONE vivid real-world analogy and a visual mental model — draw it as ASCII art or a clear step-by-step diagram — with a concrete example using real numbers. Then ask me one question to check I got the mental picture, and wait for my reply. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🤔 Walk me through it (interactive)

Socratic — adapts to where you're stuck.

Teach me **Design a Car Rental System** interactively. Ask me ONE guiding question at a time, wait for my answer, and adapt to my confusion — build the idea with me step by step instead of explaining it all at once. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🧪 Quiz me & fix my gaps

Active recall exposes what you missed.

Quiz me on **Design a Car Rental System** with 5 questions, easy to tricky, ONE at a time. Tell me if each answer is right; at the end, explain clearly what I got wrong and why. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🧠 Make it stick

Intuition + hook + flashcards for long-term memory.

Help me remember **Design a Car Rental System** for the long term: give the one-sentence intuition, a memorable hook/mnemonic, a tiny worked example, and 3 active-recall flashcards (Q -> A). If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.

📝 My notes