In the last lesson, we talked about design, and we saw how difficult it can
be to come up with a good and effective design for a given software system. To
help address these difficulties, we will discuss
design patterns, which can support design activities by
providing general, reusable solutions to commonly occurring design
problems. Similar to architectural styles, design patterns can
help developers build better designed systems by reusing design solutions that
worked well in the past and by building on those solutions.