Source: https://dept-info.labri.fr/~beurton/Enseignement/Design-Pattern.pdf