Source: https://www.cse.msu.edu/~cse870/Lectures/Sp2021/09b-design-patterns-notes2021.pdf