No es de sorprenderse que el software ha evolucionado y de igual manera las prácticas de desarrollo. En un inicio, el software se desarrollaba en su totalidad, y luego se hacían las pruebas. Problemas similares o inclusive los mismos problemas, se volvían a resolver en su totalidad, generando tiempo desperdiciado. Luego, las pruebas se incluyeron como parte del desarrollo. Sin embargo, continuaba el inconveniente de reutilización.
Es así que, ante problemas comunes han propuesta un conjunto de patrones de diseño, que permitirán la reutilización de código y la validez del funcionamiento óptimo, puesto que son propuestas que han sido empleadas por muchos desarrolladores, y por ende es menos propenso a tener errores. De igual manera, son consideradas las mejores soluciones ante problemas comunes.