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!

--

--

--

Hi :)

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

Implement Custom Search In GPT-3

Reshape R dataframes wide-to-long with melt — tutorial and visualization

R melt() to reshape dataframes from wide to long

TiDB 5.2 — Translytical Processing Made Easier and Faster

Karen Brant https://t.co/juDMvI3OiG Thanks for Following us on Twitter!

Catto (192.168.51.139) (GTW/Very Hard)

Basics of Kotlin- Part 4

6 Times A Week For Two Months — Here’s What I Learned

I’m Starting a PhD in Computer Vision

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
E.Y.

E.Y.

Hi :)

More from Medium

Formulae for B-tree and B⁺-tree in DB

Active Databases and Triggers

Small LINQ Big Performance

The Basics of Application Memory Management

memory ram