Mastering the art of designing scalable and efficient systems is paramount in object-oriented design (OOD) interviews. One common scenario presented to software engineers during these interviews is designing a parking lot system. This seemingly straightforward problem encompasses various design principles and considerations, making it an excellent litmus test for a candidate’s OOD skills and a staple among software engineer system design interview questions.
This blog delves into the intricacies of designing a parking lot system using object-oriented principles, patterns, and best practices. We’ll leverage a comprehensive implementation that covers various parking lot system components, including vehicle management, parking spot allocation, ticketing, payment processing, etc. Additionally, we’ll explore an OOD interview guide, providing insights and guidelines for effectively navigating low-level design interviews.
Here's a detailed guide on System Design.
Problem definition#
A parking lot system is an essential infrastructure in various public venues like shopping malls, stadiums, and offices, providing designated vehicle spaces. These lots contain a fixed number of parking spots tailored for different vehicle types, each charged based on the parking duration. Upon entry, vehicles receive a parking ticket to track their stay. When exiting, drivers can settle their fees at automated exit panels, utilizing payment methods such as cards or cash. This system ensures efficient vehicle management and revenue collection within parking facilities.
Requirements collection#
Let’s define the requirements for the parking lot problem:
R1: Four vehicles should be allowed to park in the parking lot: Car, Truck, Van, and Motorcycle.
R2: The parking lot should have three spots: CompactSpot, LargeSpot, and MotorcycleSpot.
R3: The parking lot should have a display board that shows its status, such as the number of spots, free spots, and occupied spots.
R4: If the parking lot is completely occupied, the system should display a message on the entrance and the parking lot display board.
R5: The system should generate a receipt at the exit.
R6: Customers should be able to collect a parking ticket from the entrance and pay at the exit.
R7: Payment should be calculated hourly and based on vehicle type.
R8: Payment can be made using either a credit/debit card or cash.
Class diagram#
In the class diagram for the parking lot system, we’ll identify and design classes, abstract classes, and interfaces based on the requirements.
Components of a parking lot system#
As we take a bottom-up approach to designing the parking lot system, we’ll begin by identifying and designing the classes for smaller components like vehicles and parking spots. Subsequently, we’ll integrate these smaller components into the class representing the parking lot system.
The Vehicle class#
The Vehicle class serves as the base class for a generic vehicle, with attributes for licensePlate and type, along with corresponding getters and setters. Subclasses Motorcycle, Car, Van, and Truck extend the Vehicle class, each initializing the licensePlate attribute and the vehicle type.
The ParkingSpot class#
The ParkingSpot class is the base class, featuring attributes such as vehicle, type, and occupied. Subclasses CompactSpot, MotorcycleSpot, and LargeSpot inherit from ParkingSpot, representing specific types of parking spots tailored for different vehicle sizes or types. Each subclass inherits the base class’s attributes and behaviors, enabling the representation of various parking spot types within the system.
The PaymentStrategy interface#
The PaymentStrategy interface handles different payment methods and provides concrete implementations for CardPayment and CashPayment. Each concrete class implements the pay method according to its respective payment method. This design allows for easy addition of new payment methods in the future without modifying existing code.
The VehicleFactory class#
The VehicleFactory class simplifies creating instances of different vehicle subclasses by encapsulating the creation logic within a single class, promoting code organization and maintainability.
The ParkingSpotFactory class#
The ParkingSpotFactory class simplifies creating instances of different parking spot subclasses by encapsulating the creation logic within a single class, promoting code organization and maintainability.
The CentralPaymentSystem class#
The CentralPaymentSystem class provides a centralized mechanism for processing payments in a system, ensuring consistency and encapsulating payment-related functionalities within a single component.
The ParkingFloor class#
The ParkingFloor class encapsulates the functionality of managing parking spots on a particular parking lot floor. It provides methods for adding, removing, and retrieving information about parking spots on the floor.
The ParkingTicket class#
The ParkingTicket class encapsulates the data and behavior associated with a parking ticket, including its unique identifier, associated vehicle, and entry and exit times.
The FareCalculator class#
The FareCalculator class encapsulates the logic for calculating parking fares based on the vehicle type and the parking duration. It provides flexibility to customize rates for different vehicle types and ensures accurate fare calculation.
The EntrancePanel class#
The EntrancePanel class encapsulates the logic for issuing parking tickets to vehicles entering the parking lot, ensuring that vehicles are parked in suitable spots, and maintaining records of issued tickets.
The Receipt class#
The Receipt class provides a convenient way to display the receipt details for a parking transaction using the provided ParkingTicket object and fare information.
The ExitPanel class#
The ExitPanel class encapsulates the logic for handling vehicle exit operations, including calculating fares, processing payments, and updating parking lot records.
The DisplayBoard class#
The DisplayBoard class provides a convenient way to visualize a parking lot’s status by encapsulating the logic for retrieving and displaying relevant information from the associated ParkingLot object.
The ParkingLot class#
The ParkingLot class encapsulates the functionality of managing parking spots, parking tickets, and vehicle presence in the parking lot system. It provides methods for accessing and manipulating parking lot data, enabling efficient parking lot management operations.
The ParkingLotInitializer class #
Using predefined spot types, the ParkingLotInitializer class encapsulates the logic for initializing a parking lot with a specified structure, including the number of floors and spots per floor.
The ParkingSpotManager class#
The ParkingSpotManager class encapsulates the logic for parking and removing vehicles from parking spots, finding spots for specific vehicles, and freeing up parking spots when needed within a parking lot system.
Relationship between the classes#
The relationship between the classes in the parking lot system implementation can be summarized as follows:
Association#
The class diagram exhibits the following association relationships:
One-way association#
The
VehicleFactoryhas a one-way association withVehicle.The
ParkingSpotFactoryhas a one-way association withParkingSpot.The
ParkingSpothas a one-way association withVehicle.The
ParkingSpotManagerhas a one-way association withVehicleandParkingSpot.The
DisplayBoardhas a one-way association withParkingLot.The
EntrancePanelhas a one-way association withParkingSpotManagerandParkingLot.The
ExitPanelhas a one-way association withParkingSpotManager,Receipt,CentralPaymentSystem, andParkingLot.The
CentralPaymentSystemhas a one-way association withPaymentStrategy.The
FairCalculatorhas a one-way association withParkingTicket.
Two-way association#
The
ParkingSpotManagerhas a two-way association withParkingLot.
Aggregation#
The class diagram has the following aggregation relationships:
The
ParingFloorhas an aggregation relationship withParkingSpot.The
ParkingLothas an aggregation relationship withParkingTicketandParkingFloor.The
ParkingLotInitializerhas an aggregation relationship withParkingLot.
Inheritance#
The following classes show an inheritance relationship:
The
Car,Truck,Van, andMotorcycleclasses inherit from theVehicleclass.The
CompactSpot,LargeSpot, andMotorcycleSpotclasses inherit from theParkingSpotclass.The
CashPaymentandCardPaymentclasses implement thePaymentStrategyinterface.
Note: We have already discussed the inheritance relationship between classes in the class diagram section above.
Class diagram of the parking lot system#
Here is the complete class diagram for our parking lot system:
Design patterns#
In the implementation of the parking lot system, several design patterns are utilized to enhance the structure, maintainability, and flexibility of the system:
Design patterns | Description |
Singleton pattern | The |
Factory method pattern | The Factory Method pattern is implemented in the |
Strategy pattern | The Strategy pattern is employed in the |
Observer pattern | The Observer pattern is utilized in the |
Command pattern | The Command pattern is implemented in the handler classes ( |
SOLID design principles#
The SOLID principles aim to make software designs more understandable, flexible, and maintainable. They consist of:
Design Principle | Description |
Single responsibility principle (SRP) | The |
Open/Closed principle (OCP) | The |
Liskov substitution principle (LSP) | The |
Interface segregation principle (ISP) | The |
Dependency inversion principle (DIP) | The |
Code for the parking lot system#
We’ve gone over the different aspects of the parking lot system and observed the attributes attached to the problem using the class diagram. Let’s explore the more practical side of things, where we will work on implementing the parking lot system using multiple languages. This is usually the last step in an object-oriented design interview process.
We have selected the Java programming languages to implement the parking lot system.
The Vehicle hierarchy#
The Vehicle hierarchy includes Car, Motorcycle, Van, and Truck, all inherited from a base Vehicle class.
Parking spot management#
A ParkingSpotManager class manages different types of parking spots (Compact, Large, Motorcycle). This class handles parking and removing vehicles from spots.
Payment system#
Payment strategies (CardPayment, CashPayment) are implemented using the PaymentStrategy interface. The CentralPaymentSystem class handles payment processing.
Parking floor#
Represents a level or floor within the parking lot containing a collection of parking spots. It manages the addition and removal of parking spots.
Fare calculator#
Calculates parking fare based on vehicle type and duration of parking stay, with customizable hourly rates for different vehicle types.
Ticket management#
The ParkingTicket class manages ticket information, including entry and exit times, vehicle details, and fare calculation.
Entrance and exit panels#
Both EntrancePanel and ExitPanel classes handle vehicle entry and exit operations, respectively.
Receipt generation#
The Receipt class generates receipts displaying ticket information, entry and exit times, total hours parked, and fare.
Display board#
The DisplayBoard class displays parking lot status, including total spots, free spots, occupied spots, and current vehicles.
Parking lot#
The central entity manages the parking system, including floors, spots, tickets, and current vehicle status. It initializes, tracks, and updates parking lot information.
Parking lot initialization#
The ParkingLotInitializer class initializes the parking lot with a specified number of floors and spots per floor.
User interaction#
The system provides options for users to enter vehicles, exit vehicles, display current vehicles, and view parking lot status. User inputs are managed through various handlers like EnterVehicleHandler, ExitVehicleHandler, DisplayCurrentVehiclesHandler, and MenuOptionHandler, and these classes are not part of the core design of the parking lot system.
Main execution #
The DriverMain class initializes the parking lot, manages user interactions through a menu system, and orchestrates the overall flow of the parking lot system.
The above-implemented parking lot system offers comprehensive functionalities for vehicle entry and exit, payment processing, and real-time status display. Employing modular design patterns like Strategy and Factory ensures flexibility to adapt to evolving requirements. This design establishes a robust foundation for a scalable and adaptable parking management solution, allowing customization and enhancement. You can modify and improve the design according to your needs and preferences.
OOD interview guide#
Object-oriented design (OOD) interviews test your ability to solve complex problems using OOD principles and design patterns. Here’s a simple guide to help you prepare:
Understand OOD concepts: Learn the key principles of OOD, like abstraction, encapsulation, inheritance, and polymorphism for scalable and maintainable systems.
Practice solving problems: Regularly solve coding problems that require object-oriented solutions. Practice designing object models for real-world scenarios, like a parking lot or a banking system.
Know design patterns: Familiarize yourself with design patterns like Singleton, Factory, Strategy, Observer, and State, and learn how and when to use them.
System design skills: Focus on designing systems that are scalable, perform well, and can be easily extended with new features. Be prepared to discuss why you made certain design choices based on constraints.
Effective communication: Clearly explain your problem-solving process and design decisions. Be open to suggestions and able to discuss alternative solutions.
Review past projects: Reflect on previous projects and identify patterns and challenges you encountered. Be ready to discuss these projects with interviewers, explaining how you applied OOD principles.
Stay updated: Stay informed about the latest OOD and software design trends.
Mock interviews: Participate in realistic mock interviews to simulate the interview experience. Use feedback from these mock interviews to improve your skills. You can visit the Educative AI-based mock interview to prepare for FAANG/MAANG object-oriented design, system design, API design, and coding interviews.
Continuous learning: Engage with the software development community by joining forums, attending meetups, and participating in discussions. Continuously practice your skills to stay sharp and improve over time.
By following this guide and dedicating time to practice, you can build confidence to do well in OOD interviews and handle tough design problems effectively. Also consider exploring the following courses as an excellent starting point and very helpful for your system design interviews:
Conclusion#
Mastering object-oriented design principles is essential for tackling complex system design challenges like designing a parking lot. We can create scalable and maintainable solutions by breaking down the problem, applying SOLID principles, and utilizing design patterns effectively. Remember to practice problem-solving, understand design patterns, prioritize code readability, hone system design skills, and foster effective communication to excel in interviews and real-world projects. Keep learning and practicing to become a proficient and versatile developer.