Design patterns are general solutions to common problems seen in software development. They provide a way to describe and communicate the issue, and create a common vocabulary for design; they nor, however, specific to any particular language, nor are they required - they are solutions to existing problems, not solutions looking for a problem.
There are four primary types of design patters:
Creational Patterns
Creational patterns deal with the creation of objects. Their primary goal is to abstract the instantiation process, thus making the system independent of how objects are created, composed, and represented. In other words, we can use this type of pattern to hide those complexities and allow for easier modification of the object creation logic.
Structural Patterns
Structural patterns deal with the class structure of a program, such as OOP Inheritance and Composition. Their focus is on how objects are put together to build more complex systems; in particular, they help organize classes and objects into larger structures and often help define relationships between entities.
Behavioral Patterns
Behavioral patterns provide solutions for the interaction between objects, providing loose coupling and flexibility (see SOLID). In particular they are concerned with the algorithms and assignment of responsibility amongst those objects, and how to define efficient, flexible, and loosely coupled communication channels without creating strict dependencies on concrete implementations.