Developing software is hard, there are many aspects to code that developers need to consider when writing the components and libraries they will use to solve problems and provide solutions. Developers often strive to try keep their code clean and testable in an attempt to eliminate bugs and too much complexity creeping into their solutions.
The important thing developers need to keep in mind, is that there is no need to solve all problems from first principles, because undoubtedly other developers will have encountered the same or similar problems before and have come up with a solution. To become a proficient developer we need to learn and understand the approaches taken of those that came before us.
Software Deign patterns represent some best practices adapted by experienced object-oriented software developers, to implement eloquent and reusable solutions to common problems.
Design patterns are a powerful tool for software developers. However, they not prescriptive specifications for software. It's important to understand the concepts that design patterns describe, rather than memorising their exact classes, methods and properties.
Learning to apply patterns appropriately is what developers should strive for. Using the incorrect pattern for a situation or applying a design pattern to a trivial solution can over-complicate your code and lead to maintainability issues.
All well structured object oriented architectures are full of patterns. Indeed, one of the ways that I measure the quality of an object oriented system is to judge whether or not its developers have paid careful attention to the common collaborations among its objectsGrady Booch - Design Patterns : Elements of Reusable Object-Oriented Software
Elements of Reusable Object-Oriented Software
23 patterns allow designers to create more flexible, elegant, and ultimately reusable designs without having to rediscover the design solutions themselves
Head First Design Patterns
Building Extensible and Maintainable Object-Oriented Software
patterns that matter, when to use them and why, how to apply them to your own designs, and the object-oriented design principles on which they're based.