https://bootcamp.uxdesign.cc/10-common-software-design-patterns-and-how-they-improve-your-code-8b9baf7ea514