Low Level Design Parking Lot System Review and Improvements Points Needed

I need to design a simple single floor parking design system which have three different types of parking slot available for two wheeler , four wheeler and Eight Wheeler Vehicle. Is Oops concepts are taken care in my code , I believe I am doing lot of repetitive codes.

public interface Slot {
    String getSlotType();
    int getSlotNUmber();
    boolean isEmpty();
    Vehicle getCurrentVechicle();
    void parkVehicle(Vehicle vehicle);

    void removeVehicle();
}

public class TwoWheelerSlot implements Slot {
    private String slotType;
    private int slotNumber;
    private boolean isEmpty;
    private Vehicle vehicle;

    public TwoWheelerSlot(int slotNumber){
        this.slotType = String.valueOf(SlotType.TWO_WHEELER);
        this.isEmpty = true;
        this.slotNumber = slotNumber;
    }

    @Override
    public String getSlotType() {
        return slotType;
    }

    @Override
    public int getSlotNUmber() {
        return slotNumber;
    }

    @Override
    public boolean isEmpty() {
        return isEmpty;
    }

    @Override
    public Vehicle getCurrentVechicle() {
        return vehicle;
    }

    @Override
    public void parkVehicle(Vehicle vehicle) {
        this.vehicle = vehicle;
        isEmpty = false;
    }

    @Override
    public void removeVehicle() {
        isEmpty = true;
    }
}

public class FourWheelerSlot implements Slot {
    private String slotType;
    private int slotNumber;
    private boolean isEmpty;
    private Vehicle vehicle;

    public FourWheelerSlot(int slotNumber){
        this.slotType = String.valueOf(SlotType.FOUR_WHEELER);;
        this.isEmpty = true;
        this.slotNumber = slotNumber;
    }

    @Override
    public String getSlotType() {
        return slotType;
    }

    @Override
    public int getSlotNUmber() {
        return slotNumber;
    }

    @Override
    public boolean isEmpty() {
        return isEmpty;
    }

    @Override
    public Vehicle getCurrentVechicle() {
        return vehicle;
    }

    @Override
    public void parkVehicle(Vehicle vehicle) {
        this.vehicle = vehicle;
        isEmpty = false;
    }

    @Override
    public void removeVehicle() {
        isEmpty = true;
    }
}

public class EightWheelerSlot implements Slot {
    private String slotType;
    private int slotNumber;
    private boolean isEmpty;
    private Vehicle vehicle;

    public EightWheelerSlot(int slotNumber){
        this.slotType = String.valueOf(SlotType.EIGHT_WHEELER);;
        this.isEmpty = true;
        this.slotNumber = slotNumber;
    }

    @Override
    public String getSlotType() {
        return slotType;
    }

    @Override
    public int getSlotNUmber() {
        return slotNumber;
    }

    @Override
    public boolean isEmpty() {
        return isEmpty;
    }

    @Override
    public Vehicle getCurrentVechicle() {
        return vehicle;
    }

    @Override
    public void parkVehicle(Vehicle vehicle) {
        this.vehicle = vehicle;
        isEmpty = false;
    }

    @Override
    public void removeVehicle() {
        isEmpty = true;
    }
}

public enum SlotType {
    TWO_WHEELER,
    FOUR_WHEELER,
    EIGHT_WHEELER
}

public class SlotFactory {

    public Slot createSlot(SlotType slotType, int slotNumber) {
        switch (slotType) {
            case TWO_WHEELER:
                return new TwoWheelerSlot(slotNumber);
            case FOUR_WHEELER:
                return new FourWheelerSlot(slotNumber);
            case EIGHT_WHEELER:
                return new EightWheelerSlot(slotNumber);
            default:
                throw new IllegalArgumentException("Invalid slot type: " + slotType);
        }
    }
}

public interface Vehicle {
    VehicleType getVehicleType();
    String getVehicleNumber();
}

public class TwoWheelerVehicle implements Vehicle {
    private VehicleType vehicleType;
    private String vehicleNUmber;

    public TwoWheelerVehicle(String vehicleNUmber){
        this.vehicleNUmber = vehicleNUmber;
        this.vehicleType = VehicleType.TWO_WHEELER;
    }

    @Override
    public VehicleType getVehicleType() {
        return vehicleType;
    }

    @Override
    public String getVehicleNumber() {
        return vehicleNUmber;
    }
}

public class FourWheelerVehicle implements Vehicle {

    private VehicleType vehicleType;
    private String vehicleNUmber;

    public FourWheelerVehicle(String vehicleNUmber){
        this.vehicleNUmber = vehicleNUmber;
        this.vehicleType = VehicleType.FOUR_WHEELER;
    }

    @Override
    public VehicleType getVehicleType() {
        return vehicleType;
    }

    @Override
    public String getVehicleNumber() {
        return vehicleNUmber;
    }
}

public class EightWheelerVehicle implements Vehicle {
    private VehicleType vehicleType;
    private String vehicleNUmber;

    public EightWheelerVehicle(String vehicleNUmber){
        this.vehicleNUmber = vehicleNUmber;
        this.vehicleType = VehicleType.EIGHT_WHEELER;
    }

    @Override
    public VehicleType getVehicleType() {
        return vehicleType;
    }

    @Override
    public String getVehicleNumber() {
        return vehicleNUmber;
    }
}

public enum VehicleType {
    TWO_WHEELER,
    FOUR_WHEELER,
    EIGHT_WHEELER
}

import java.util.List;

public class ParkingSpotManager {
    List<Slot> parkingSlots;

    public ParkingSpotManager(List<Slot> slots){   // Dependency INjection
        this.parkingSlots = slots;
    }

    public Slot parkVehicle(Vehicle vehicle) {
        System.out.println("Looking slot for vehicle :  "+vehicle.getVehicleNumber());
        for(Slot slot : parkingSlots) {
            if(slot.isEmpty() && String.valueOf(slot.getSlotType()).equals(String.valueOf(vehicle.getVehicleType()))) {
                slot.parkVehicle(vehicle);
                System.out.println("        Slot Found :  "+slot.getSlotNUmber());
                return slot;
            }
        }
        return null; // No available slot found for the vehicle
    }

    public void removeSlot(int slotnumber){
        for(Slot slot : parkingSlots) {
            if(slot.getSlotNUmber() == slotnumber) {
                System.out.println("        Removing Slot  :  "+slot.getSlotNUmber());
                slot.removeVehicle();
            }
        }
    }
}

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Slot> parkingslots = new ArrayList<>();
        SlotFactory slotFactory = new SlotFactory();
        for (int i = 1; i <= 30; i += 3) {
            parkingslots.add(slotFactory.createSlot(SlotType.TWO_WHEELER, i));
            parkingslots.add(slotFactory.createSlot(SlotType.FOUR_WHEELER, i + 1));
            parkingslots.add(slotFactory.createSlot(SlotType.EIGHT_WHEELER, i + 2));
        }

        ParkingSpotManager manager = new ParkingSpotManager(parkingslots);
        manager.parkVehicle(new TwoWheelerVehicle("111"));
        manager.parkVehicle(new FourWheelerVehicle("411"));
        manager.parkVehicle(new EightWheelerVehicle("812"));
    }
}

Comments (5)