Design Patterns in Action(5)- Facade

Photo by Shardar Tarikul Islam on Unsplash

Simply put, the facade pattern is used to serve as a high level interface for the client to interact with a set of more complex subsystems. It hides the implementation details of the underlying systems and exposes an unified, sometimes even single method to the client.

The benefits of it are:

  • Loose coupling between client and subsystems.
  • Make underlying systems easy to use and test.
  • Simplified interface thanks to a layer of indirection of facade.

Facade can be easily confused with Adapter, or Decorator pattern. But essentially:

  • Facade is a wrapper of implementations of multiple sub systems through unified interface.
  • Adapter is a wrapper of another subsystems which needs to conform to the subsystem’s interface internally.
  • Decorator is a wrapper of another systems with dynamically added extra functionalities.

Let’s take a look at an example in Python. The code is quite explanatory.

class Oven:
def wait_for_bake(self, bake_in_min):
self.bake_in_min = bake_in_min


class Mixer:
def choose_flour(self, flour_kind):
self.flour_kind = flour_kind

def wait_for_rise(self, rise_in_min):
self.rise_in_min = rise_in_min


class Shelf:
def label_bread(self):
pass


class BreadFacade:
def __init__(self):
self.mixer = Mixer()
self.oven = Oven()
self.shelf = Shelf()

def produce(self, flour_kind, rise_in_min, bake_in_min):
self.mixer.choose_flour(flour_kind)
self.mixer.wait_for_rise(rise_in_min)
self.oven.wait_for_bake(bake_in_min)
self.shelf.label_bread()


bread = BreadFacade()
bread.produce("wholemeal", 60, 120)

And here is the implementation in JavaScript:

class Oven {
wait_for_bake(bake_in_min) {
this.bake_in_min = bake_in_min;
return;
}
}

class Mixer {
choose_flour(flour_kind) {
this.flour_kind = flour_kind;
return;
}

wait_for_rise(rise_in_min) {
this.rise_in_min = rise_in_min;
return;
}
}

class Shelf {
label_bread() {
return;
}
}

class BreadFacade {
constructor() {
this.mixer = new Mixer();
this.oven = new Oven();
this.shelf = new Shelf();
}

produce(flour_kind, rise_in_min, bake_in_min) {
this.mixer.choose_flour(flour_kind);
this.mixer.wait_for_rise(rise_in_min);
this.oven.wait_for_bake(bake_in_min);
this.shelf.label_bread();
}
}

let bread = new BreadFacade();
bread.produce("wholemeal", 60, 120);

That’s so much of it!

Happy Reading!

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store