https://medium.com/@anderson.buenogod/design-and-architecture-patterns-every-software-engineer-should-know-2e750ff07321