A design pattern is a description of a set of interacting classes that provide a
framework for a solution to a generalized problem in a specific context or environment.
A pattern suggests a solution to a particular problem or issue in object-oriented software development. 
Modules designed without extensibility in mind are prone to being broken if tried to add
features and components.
Sooner or later, closed, inflexible designs break under the weight of changes.
Design patterns assist in laying the foundation for a flexible architecture,
which is the hallmark of every good object-oriented design.
Design patterns make the design process cleaner and more efficient
They allow you to build software faster
POPULAR DESIGN PATTERNS:
Improve the extensibility of your applications and the reuse of your objects.
the composite, and
the state classes