Source: https://www.bu.edu/csmet/files/2021/02/MET-CS-665-Software-Design-and-Patterns.pdf