Parking lot LLD models and components

class ParkingLot {
  int id;
  String name;
  Address address;
  
  List<ParkingFloor> parkingFloors;
  List<EntryGate> entryGates;
  List<ExitGate> exitGates;
  
  boolean isParkingLotFull();
  boolean canPark(VehicleType vehicleType);
  ParkingSpace getParkingSpace(VehicleType vehicleType);
  ParkingSpace vacateParkingSpace(String parkingSpaceId);
  
}

class Address {
  String street;
  String city;
  String state;
  String country;
  String zipCode;
}  

class ParkingFloor {
  int id;
  Map<ParkingSpaceType, Dequeu<ParkingSpace>> parkingspaces;
  Map<String, ParkingSpace> usedParkingSpace;
  
  boolean isFloorFull();
  ParkingSpaceType getParkingSpaceTypeForVehicle(VehicleType vehicleType);
  boolean canPark(VehicleType vehicleType);
  ParkingSpace getParkingSpace(VehicleType vehicleType);
  ParkingSpace vacateParkingSpace(String parkingSpaceId);
  boolean canPark(VehicleType vehicleType);
  boolean canPark(ParkingSpaceType parkingSpaceType);
}

class ParkingSpace {
  int id;
  String parkingSpaceId;
  ParkingSpaceStatus parkingSpaceStatus;
  ParkingSpaceType parkingSpaceType;
  String vehicleId;
  
  void assignVehicleToParkingSpace(String vehicleId);
  void freeParkingSpace();
}

class Vehicle {
  String licenseNumber;
  VehicleType vehicleType;
  ParkingTicket parkingTicket;
}

class Gate {
  int id;
}

class EntryGate extends Gate {
  ParkingTicket getParkingTicket(Vehicle vehicle);
  ParkingTicket buildTicket(String parkingSpaceId, String licenseNumber)
  
}

class ExitGate extends Gate {
  ParkingTicket scanAndVacateParkingLot(ParkingTicket parkingTicket);
  Double calculateCost(ParkingSpaceType parkingSpaceType, ParkingTicket parkingTicket);
  
 } 
 
 class ParkingTicket {
    String parkingTicketId;
    String licenseNumber;
    String parkingSpaceId;
    Date entryDate;
    Date exitDate;
    Double totalCost;
    TicketStatus ticketStatus;
  }
  
  class Payment {

    String paymentId;
    Date paymentDate;
    Double totalCost;
    String ticketId;
    PaymentStatus paymentStatus;
    
    void makePayment();
  }
  
enum VehicleType {
    BIKE, CAR, TRUCK, EBIKE, VAN
}

enum PaymentStatus {
    CANCELLED, PENDING, SUCCESS, FAILURE
}

enum TicketStatus {
    ACTIVE, LOST, INACTIVE
}

enum ParkingSpaceType {
    ABLED, CAR, BIKE, LARGE, EBIKE
}

enum ParkingSpaceStatus {
    AVAILIABLE, BOOKED, RESERVED
}

enum AccountStatus {
    ACTIVE, INACTIVE, BLOCKED
}

interface PricingStrategy {
    Double getPrice(ParkingSpaceType parkingSpaceType);
}

class AdminService {
  void addAdmin(Admin admin);
  Admin getAdminByEmail(String email);
}

class Account {

    private String accountId;
    private String userName;
    private String password;
    private AccountStatus accountStatus;
}

class Admin extends Account{

    private String name;
    private String email;
    private String phoneNumber;
    private Address addres;

    ParkingLotService parkingLotService;
}

class ParkingLotService {
  void addParkingLot(ParkingLot parkingLot);
  ParkingLot getParkingLotById(String parkingLotId);
  void addParkingFloorToParkingLot(String parkingLotId, ParkingFloor parkingFloor);
  void addParkingSpaceToParkingFloorOfaParkingLot(String parkingLotId, String parkingFloorId, ParkingSpace parkingSpace);
  void addEntryGateToAParkingLot(String parkingLotId, EntryGate entryGate);
  void addExitGateToAParkingLot(String parkingLotId, ExitGate exitGate) ;
}  
Comments (2)