Source: https://home.cs.colorado.edu/~kena/classes/5448/f09/lectures/16-introdesignpatterns.pdf