Since the invention of Object Oriented Programming, its
philosophy has become exceedingly popular among the programming community and
has had a wide spread acceptance in the technology world. Although OOP has
become largely popular, it has spawned some repeated design problems with its
continuous use. There was a need for rectifying these recurring problems in
software designs. The need of the hour was a solution for these common
problems. The use of design patterns has been a significant improvement in Object
Oriented Design (OOD) and facilitates the design and development of high
quality, maintainable software at a much faster rate and at a lower cost. Design
Patterns are the proven and best solution to the common problems and increasing
complexities involved in software development life cycles. One of the most
important factors that determine the efficiency of a software design is its
adaptability to change. My intent in authoring this article is to provide the
readers an overview of Design Patterns, their applicability and the common
pitfalls of improper usage or application of these design patterns in software
designs.