Design patterns became popular in the 1990s due to influential books describing recurring solutions to object-oriented design problems. A design pattern describes a general solution to a common problem in software design. They allow programmers to reuse successful past designs. Some key design patterns discussed include state, observer, open-closed principle, and dependency inversion. Applying design patterns helps increase design speed and reuse, while reducing costs.