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) ;
}