What is Facade pattern?

The Facade pattern is a structural design pattern that provides a simplified interface to a complex system, library, or set of classes. It encapsulates the complexity of the underlying subsystem and provides a unified interface that is easier to use and understand.

The Facade pattern acts as a high-level interface that makes a complex system more accessible and manageable by providing a simplified set of methods or operations. It hides the complexities of the subsystem and provides a single entry point for the client code to interact with the system.

Key components of the Facade pattern:

  1. Facade: The facade is a class or interface that provides a simplified interface to the underlying subsystem. It acts as a gateway or entry point for the client code and delegates requests to the appropriate classes within the subsystem.
  2. Subsystem: The subsystem represents the collection of classes, components, or services that form the complex system. It contains the actual implementation and functionality of the system.

Benefits and use cases of the Facade pattern:

  1. Simplified interface: The Facade pattern provides a simplified and easy-to-use interface to a complex system. It encapsulates the underlying complexity and presents a unified interface that hides the details of the subsystem.
  2. Abstraction of complexity: By providing a facade, the pattern abstracts the complexity of the subsystem and presents a higher-level view. It shields the client code from the intricate details of the system and provides a more intuitive and manageable interface.
  3. Decoupling of client code and subsystem: The Facade pattern decouples the client code from the subsystem. The client code interacts with the simplified facade interface and is not directly dependent on the subsystem’s implementation. This promotes loose coupling and helps manage dependencies.
  4. Easier maintenance and evolution: The Facade pattern provides a clear separation between the client code and the subsystem. This separation makes it easier to maintain and modify the subsystem’s internals without affecting the client code. It allows for the evolution of the system while keeping the external interface stable.
  5. Improvement of code readability and usability: The Facade pattern enhances code readability and usability by providing a concise and well-defined interface. It improves the understanding of the system’s functionality and reduces the cognitive load on the client code developers.

Example of the Facade pattern in Java:

// Complex subsystem classes
class SubsystemA {
    void operationA() {
        System.out.println("Subsystem A: operation A");

class SubsystemB {
    void operationB() {
        System.out.println("Subsystem B: operation B");

class SubsystemC {
    void operationC() {
        System.out.println("Subsystem C: operation C");

// Facade class
class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;
    private SubsystemC subsystemC;

    Facade() {
        subsystemA = new SubsystemA();
        subsystemB = new SubsystemB();
        subsystemC = new SubsystemC();

    void operation() {

// Client code
public class Application {
    public static void main(String[] args) {
        Facade facade = new Facade();

In the above example, the Facade pattern is used to provide a simplified interface to a complex system consisting of SubsystemA, SubsystemB, and SubsystemC. The SubsystemA, SubsystemB, and SubsystemC classes represent the complex subsystem components with their respective operations.

The Facade class acts as a facade, providing a simplified interface to the client code. It encapsulates the complexity of the subsystem by creating instances of the subsystem classes and exposing a single method operation() that delegates the calls to the appropriate subsystem methods.

The client code interacts with the facade (Facade class) and calls its operation() method. Behind the scenes, the facade orchestrates the complex system by invoking the appropriate methods of the subsystem components.

By using the Facade pattern, the client code is shielded from the complexities of the subsystem. It doesn’t need to interact directly with the subsystem classes, making the code more readable, maintainable, and less prone to errors. The facade provides a simplified and unified interface to the subsystem, allowing the client code to interact with the system in a more intuitive way.

error: Content is protected !!