Source: http://www.dil.univ-mrs.fr/~novelli/GL/COURS/07_DesignPatterns.pdf