https://learncsdesign.medium.com/learn-gof-design-patterns-to-solve-problems-in-software-design-ea50ced754fe