Source: http://www2.ift.ulaval.ca/~lamontagne/glo3001/DesignPatterns Creation.pdf