Se você trabalha com programação há algum tempo, já deve ter percebido uma coisa: muitos problemas se repetem. Uma hora é código difícil de manter. Outra hora é um monte de if/else crescendo sem controle. Em outro projeto, a criação de objetos vira bagunça. E por aí vai. Foi justamente para lidar com esse tipo