Design Patterns are elegant solutions to repetitive problems in software design, like:
Design Patterns show how to structure classes, and how these classes should talk to each other.
Usually Design Patterns are split into three categories:
There are many unofficial and undocumented patterns out there that we might find useful in certain situations.
One of the goals is to minimize coupling.