Design patterns are great, if used correctly.
It's useful to remember that the idea of design patterns originated in architecture. Architecture can vary wildly. However, there are many core ideas that are present in any building. In this way, think of patterns as building blocks of design. It is important to note that not every building includes all possible architectural patterns.
Say you're designing a house. Rather than having the front door open onto the street, you want a sheltered area before entering the house, i.e. an anteroom. This area will fit a certain pattern. Namely, it will have two entrances, some walls and probably a roof. Note, the pattern does not specify doors, windows or how many walls. In most implementations, there will be two doors, four walls and maybe windows. However, the pattern describes an enclosed area with two entrances. One leads into the anteroom itself from outside of the house and the other leads into the rest of the house. The key here, is that if you want an anteroom you must enclose an area and provide two entrances into that area.
The typical problems with design patterns in programming are over use and the belief that they are silver bullets to fix any issue. They are not. They are ways to communicate and think about useful programming ideas. If the bits of syntax of a particular language are the bricks and mortar, patterns describe useful ways to arrange them to meet a certain needs.