A framework describes not only how to partition the responsibilities of a system among its components, but also how to think about a problem. It is therefore not only a way to reuse code, but a way to reuse design and analysis information, as well.
Frameworks are difficult to design because they are abstract.
Framework designers must look at many concrete applications to ensure that the abstractions that they are designing make sense. Frameworks are difficult to learn because the user of a framework must adopt the collaborative model of the framework. It is usually not possible to learn a framework one class at a time, but instead several classes have to be learned together. This tutorial teaches how to design frameworks. The design patterns and the set of transformations are useful for making any object-oriented design more flexible and reusable, but they are essential in framework design.