Parking Lot - Low Level Design
Requirements:
Entities:
Slot
Vehicle
VehicleSize
SlotType
Ticket
ParkingLot
TicketStatus
User-Defined types:
SlotType - SMALL, MEDIUM, LARGE
SlotStatus - AVAILABLE, OCCUPIED, WORK_IN_PROGRESS
VehicleSize - CAR, JEEP, TRUCK
TicketStatus - ISSUED, PAID
Domain classes:
class Slot {
int slotNumber;
SlotType slotType;
SlotStatus slotStatus;
void setSlotStatus(SlotStatus slotStatus) {}
}
class Vehicle {
String registrationNumber;
VehicleSize vehicleSize;
}
class Ticket {
String ticketNumber;
Vehicle vehicle;
int slotNumber;
TicketStatus ticketStatus;
DateTime issuedTime;
DateTime exitTime;
void setTicketStatus(TicketStatus ticketStatus){}
void setExitTime(DateTime exitTime) {}
}
class VehicleSlotMapper {
Map<VehicleType, SlotType> vehicleSlotMap;
static List<SlotType> getMatchingSlotsForVehicle(VehicleType vehicleType){}
}
class ParkingLot {
SlotManager slotManager;
AssignmentStrategy assignmentStrategy;
TicketManager ticketManager;
Ticket parkVehicle(Vehicle vehicle) {}
void payTicket(Ticket ticket) {}
}
class SlotManager {
List<Slot> slots;
Map<Slot, Ticket> usedSlotVehicleMap;
void createSlot(SlotType slotType) {}
void assignSlotToVehicle(Slot slot, Ticket ticket) {}
List<Slot> getAllSlots(){}
List<Slot> getAvailableSlots(){}
Map<Slot, Ticket> getUsedSlotVehicleInfo(){}
void makeSlotAvailable(Slot slot) {}
}
class TicketManager {
Map<String, Ticket> tickets;
void createTicket(Vehicle vehicle, int slotNumber, DateTime issuedTime){}
void markTicketAsPaid(Ticket ticket) {}
}
interface AssignmentStrategy {
Slot assignParkingSpace(List<Slot> slots, Vehicle vehicle);
}
class NearestSizeAppropriate implements AssignmentStrategy {
Slot assignParkingSpace(List<Slot> slots, Vehicle vehicle) {
}
}Possible extensions (yet to implement):