Source: https://www.cs.colorado.edu/~kena/classes/5448/f12/lectures/26-creationalpatterns.pdf