Source: https://www.emse.fr/~picard/cours/2A/DesignPatternsISI.pdf