Bird
Raised Fist0
LLDsystem_design~10 mins

Parking strategy pattern in LLD - Interactive Code Practice

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to define the ParkingStrategy interface.

LLD
public interface ParkingStrategy {
    boolean [1](Vehicle vehicle, ParkingLot lot);
}
Drag options to blanks, or click blank then click option'
AparkVehicle
BcanPark
CfindSpot
DreserveSpot
Attempts:
3 left
💡 Hint
Common Mistakes
Using method names that imply parking action instead of checking.
2fill in blank
medium

Complete the code to implement a strategy that parks only motorcycles.

LLD
public class MotorcycleParkingStrategy implements ParkingStrategy {
    @Override
    public boolean [1](Vehicle vehicle, ParkingLot lot) {
        return vehicle.getType() == VehicleType.MOTORCYCLE;
    }
}
Drag options to blanks, or click blank then click option'
AcanPark
BreserveSpot
CparkVehicle
DfindSpot
Attempts:
3 left
💡 Hint
Common Mistakes
Using method names that do not match the interface.
3fill in blank
hard

Fix the error in the ParkingLot class method to use the strategy correctly.

LLD
public class ParkingLot {
    private ParkingStrategy strategy;

    public ParkingLot(ParkingStrategy strategy) {
        this.strategy = strategy;
    }

    public boolean [1](Vehicle vehicle) {
        if(strategy.canPark(vehicle, this)) {
            // park vehicle logic
            return true;
        }
        return false;
    }
}
Drag options to blanks, or click blank then click option'
AfindSpot
BcanPark
CreserveSpot
DparkVehicle
Attempts:
3 left
💡 Hint
Common Mistakes
Naming the method the same as the strategy's check method.
4fill in blank
hard

Fill both blanks to complete the code for setting and using a parking strategy.

LLD
public class ParkingLot {
    private ParkingStrategy [1];

    public void setStrategy(ParkingStrategy [2]) {
        this.strategy = [2];
    }
}
Drag options to blanks, or click blank then click option'
Astrategy
BparkStrategy
CnewStrategy
DparkingStrategy
Attempts:
3 left
💡 Hint
Common Mistakes
Using the same name for field and parameter causing shadowing.
5fill in blank
hard

Fill all three blanks to complete the code for applying different parking strategies dynamically.

LLD
public class ParkingManager {
    private ParkingLot lot;

    public ParkingManager(ParkingLot lot) {
        this.lot = lot;
    }

    public void applyStrategy(ParkingStrategy [1]) {
        lot.[2]([3]);
    }
}
Drag options to blanks, or click blank then click option'
Astrategy
BsetStrategy
CapplyStrategy
DchangeStrategy
Attempts:
3 left
💡 Hint
Common Mistakes
Using incorrect method names or mismatched parameter names.

Practice

(1/5)
1. What is the main purpose of using the Parking Strategy Pattern in a parking lot system?
easy
A. To store vehicle details in a database
B. To manage payment processing for parking fees
C. To allow different algorithms for finding parking spots without changing the main system
D. To control the physical gates of the parking lot

Solution

  1. Step 1: Understand the role of strategy pattern

    The strategy pattern lets you swap different algorithms easily without changing the main code.
  2. Step 2: Apply this to parking system context

    In parking, it means you can change how spots are found without rewriting the whole system.
  3. Final Answer:

    To allow different algorithms for finding parking spots without changing the main system -> Option C
  4. Quick Check:

    Strategy pattern = flexible parking spot finding [OK]
Hint: Strategy pattern = flexible algorithm swapping [OK]
Common Mistakes:
  • Confusing strategy pattern with data storage
  • Thinking it controls hardware like gates
  • Mixing it with payment processing logic
2. Which of the following is the correct way to define a parking strategy interface in a typical object-oriented design?
easy
A. class ParkingStrategy { findSpot(vehicle) {} }
B. function findSpot(vehicle) { return spot; }
C. var ParkingStrategy = new Object();
D. interface ParkingStrategy { findSpot(vehicle): Spot; }

Solution

  1. Step 1: Identify interface syntax in OOP

    Interfaces define method signatures without implementation, e.g., interface ParkingStrategy { findSpot(vehicle): Spot; }.
  2. Step 2: Compare options

    interface ParkingStrategy { findSpot(vehicle): Spot; } correctly uses interface with method signature. Others are class, function, or object, not interface.
  3. Final Answer:

    interface ParkingStrategy { findSpot(vehicle): Spot; } -> Option D
  4. Quick Check:

    Interface = method signature only [OK]
Hint: Interface defines method signatures only [OK]
Common Mistakes:
  • Using class instead of interface for strategy
  • Defining functions outside interface context
  • Confusing object creation with interface definition
3. Given the following code snippet for two parking strategies, what will be the output when findSpot(vehicle) is called using NearestParkingStrategy?
class NearestParkingStrategy {
  findSpot(vehicle) {
    return "Nearest spot found";
  }
}
class RandomParkingStrategy {
  findSpot(vehicle) {
    return "Random spot found";
  }
}
const strategy = new NearestParkingStrategy();
console.log(strategy.findSpot('car'));
medium
A. "Nearest spot found"
B. "Random spot found"
C. undefined
D. Error: findSpot not defined

Solution

  1. Step 1: Identify which strategy instance is used

    The code creates an instance of NearestParkingStrategy and calls findSpot.
  2. Step 2: Check method output for that class

    NearestParkingStrategy.findSpot returns "Nearest spot found".
  3. Final Answer:

    "Nearest spot found" -> Option A
  4. Quick Check:

    Instance method output = "Nearest spot found" [OK]
Hint: Instance method output matches class used [OK]
Common Mistakes:
  • Confusing which strategy instance is created
  • Assuming random strategy is used
  • Expecting undefined or error without reason
4. In the following code, what is the main issue that prevents the ParkingLot from using different parking strategies correctly?
class ParkingLot {
  constructor() {
    this.strategy = null;
  }
  setStrategy(strategy) {
    this.strategy = strategy;
  }
  park(vehicle) {
    return this.strategy.findSpot(vehicle);
  }
}
const lot = new ParkingLot();
lot.park('car');
medium
A. No strategy is set before calling park, causing an error
B. The park method should not call findSpot
C. The strategy property should be a list, not a single object
D. The constructor should initialize strategy with a default value

Solution

  1. Step 1: Analyze object initialization and method calls

    The ParkingLot is created with strategy = null. No strategy is set before calling park.
  2. Step 2: Understand consequence of null strategy

    Calling this.strategy.findSpot(vehicle) when strategy is null causes an error.
  3. Final Answer:

    No strategy is set before calling park, causing an error -> Option A
  4. Quick Check:

    Null strategy causes error on method call [OK]
Hint: Always set strategy before use [OK]
Common Mistakes:
  • Thinking park method logic is wrong
  • Assuming strategy should be a list
  • Ignoring null initialization problem
5. You want to design a parking system that supports multiple vehicle types (car, bike, truck) and different parking strategies (nearest, random, reserved). Which design approach best uses the Parking Strategy Pattern to handle this complexity?
hard
A. Create separate parking lot classes for each vehicle type and hardcode the strategy inside each
B. Use a single ParkingLot class with a strategy interface; implement different strategies and select based on vehicle type at runtime
C. Store all vehicles in one list and assign spots randomly without strategy pattern
D. Use global variables to track vehicle types and apply strategies in procedural code

Solution

  1. Step 1: Identify need for flexibility and scalability

    Supporting multiple vehicle types and strategies requires flexible design without code duplication.
  2. Step 2: Apply strategy pattern with runtime selection

    Using one ParkingLot class with strategy interface allows swapping strategies dynamically based on vehicle type.
  3. Step 3: Evaluate other options

    Create separate parking lot classes for each vehicle type and hardcode the strategy inside each duplicates code, C ignores strategy pattern, D uses poor global state management.
  4. Final Answer:

    Use a single ParkingLot class with a strategy interface; implement different strategies and select based on vehicle type at runtime -> Option B
  5. Quick Check:

    Strategy pattern + runtime selection = best design [OK]
Hint: Use one class + strategy interface + runtime choice [OK]
Common Mistakes:
  • Duplicating classes per vehicle type
  • Ignoring strategy pattern benefits
  • Using global variables instead of OOP