https://medium.com/@sarmadjkhan/design-patterns-a-guide-for-effective-software-development-111e8d595258