They are not absolutely needed, but the good definitely outweighs the bad.
The good:
- Code readability: They do help you write more understandable code with better names for what you are trying to accomplish.
- Code maintainability: Allows your code to be maintained easier because it is more understandable.
- Communication: They help you communicate design goals amongst programmers.
- Intention: They show the intent of your code instantly to someone learning the code.
- Code re-use: They help you identify common solutions to common problems.
- Less code: They allow you to write less code because more of your code can derive common functionality from common base classes.
- Tested and sound solutions: Most of the design patterns are tested, proven and sound.
The bad:
- Extra levels of indirection: They provide an extra level of indirection and hence make the code a little more complex.
- Knowing when to use them: They are often abused and used in cases that they should not be. A simple task may not need the extra work of being solved using a design pattern.
- Different interpretations: People sometimes have slightly different interpretations of design patterns. Example MVC as seen by django vs. MVC as seen by Ruby on Rails.
- Singleton: Need I say more?