https://javascript.plainenglish.io/10-software-design-patterns-you-should-know-to-become-principal-engineer-b2f070564516