Source: https://home.cs.colorado.edu/~kena/classes/6448/f07/lectures/21/21-Factory.pdf