What if you could control a complicated system with just one simple command?
Why Facade pattern in LLD? - Purpose & Use Cases
Imagine you want to use a complex home theater system with many devices like a DVD player, amplifier, projector, and lights. You have to turn on each device in the right order and adjust settings manually every time.
Manually controlling each device is slow and confusing. You might forget steps or set wrong settings, causing frustration and wasted time before you can even watch a movie.
The Facade pattern creates a simple interface that hides all the complex steps. You just press one button on the remote, and the system handles turning on devices and setting them up correctly behind the scenes.
dvdPlayer.on();
amplifier.setVolume(10);
projector.on();
lights.dim();homeTheaterFacade.watchMovie();
It makes complex systems easy to use by providing a simple, unified interface that hides all the complicated details.
Using a smartphone app to control smart home devices like lights, thermostat, and security cameras with one tap instead of managing each device separately.
Facade simplifies complex systems by hiding details.
It reduces user errors and saves time.
It provides a clean, easy-to-use interface.
Practice
Facade pattern in system design?Solution
Step 1: Understand the Facade pattern role
The Facade pattern is designed to simplify interactions by providing a single interface to a complex system.Step 2: Compare options with the pattern's purpose
To provide a simple interface to a complex system correctly states the purpose. Options A, B, and C describe incorrect or harmful effects.Final Answer:
To provide a simple interface to a complex system -> Option CQuick Check:
Facade pattern = Simple interface [OK]
- Thinking Facade replaces all classes
- Believing Facade adds complexity
- Confusing Facade with Singleton pattern
Solution
Step 1: Identify Facade method visibility and calls
Facade methods are usually public to expose simplified operations and call multiple subsystems internally.Step 2: Check each option's correctness
public void complexOperation() { subsystem1.action(); subsystem2.action(); } is public and calls multiple subsystems, matching Facade pattern. private void complexOperation() { subsystem1.action(); } is private, so not accessible. void complexOperation() { return subsystem1.action(); } returns a value but calls only one subsystem. public int complexOperation() { subsystem1.action(); subsystem2.action(); return 0; } returns int unnecessarily.Final Answer:
public void complexOperation() { subsystem1.action(); subsystem2.action(); } -> Option DQuick Check:
Facade method = public + multiple calls [OK]
- Making Facade methods private
- Returning values unnecessarily
- Calling only one subsystem inside Facade
class SubsystemA {
void operationA() { print('A'); }
}
class SubsystemB {
void operationB() { print('B'); }
}
class Facade {
SubsystemA a = SubsystemA();
SubsystemB b = SubsystemB();
void doWork() {
a.operationA();
b.operationB();
}
}
void main() {
Facade f = Facade();
f.doWork();
}Solution
Step 1: Trace Facade's doWork method calls
doWork calls operationA() then operationB(), which print 'A' and 'B' respectively.Step 2: Determine output sequence
Since operationA prints 'A' first, then operationB prints 'B', output is 'AB' without spaces.Final Answer:
AB -> Option BQuick Check:
Facade calls order = AB [OK]
- Assuming output is 'BA' reversing calls
- Expecting spaces between prints
- Thinking no output due to missing return
class Subsystem {
void action() { print('Action'); }
}
class Facade {
Subsystem subsystem;
void doTask() {
subsystem.action();
}
}
void main() {
Facade f = Facade();
f.doTask();
}Solution
Step 1: Check subsystem object usage in Facade
The Facade has a subsystem field but never initializes it before calling action(), causing a null reference error.Step 2: Validate other options
Facade class should not call subsystem methods is wrong because Facade should call subsystem methods. doTask method should return a value is not required. Subsystem class should be abstract is unnecessary.Final Answer:
Subsystem object is not initialized before use -> Option AQuick Check:
Uninitialized object = runtime error [OK]
- Ignoring null object initialization
- Thinking Facade should not call subsystems
- Expecting return values unnecessarily
Solution
Step 1: Understand Facade's role in simplifying complex systems
Facade groups multiple subsystem calls into simple methods, hiding complexity from users.Step 2: Apply this to home automation
Create a single HomeAutomationFacade class that provides simple methods liketurnOnAll()andsetTemperature()to control all devices correctly describes creating a Facade class with simple methods controlling multiple devices. Options A, B, and D misunderstand Facade's purpose.Final Answer:
Create a single HomeAutomationFacade class that provides simple methods like turnOnAll() and setTemperature() to control all devices -> Option AQuick Check:
Facade = simple interface for complex devices [OK]
- Merging all logic into one big class
- Confusing Facade with inheritance
- Splitting devices further instead of simplifying
Ready to prove it?
Pass the test and this pattern moves unknown
