Design patterns are becoming increasingly popular as mechanisms to describe general solutions to design problems that can be reused in the construction of different applications.
Gamma et al. [Garnma95] define design patterns as descriptions of communicating object classes that are customized to solve a general problem in a particular contexto The basic rnotivation behind the pattern idea resides in the fact that similar design problems recur in different context [Cockburn96, Pree94, Riehle96, Buschmann96]. The main goal of patterns is to solve a specific design problem allowing flexibility of evolution.
Patterns make possible to talk, as well as to think about designs on a higher level of abstraction. Instead of thinking in terms of individual classes and their behavior, it is possible to start to think in terms of collaborating classes, their relationship and responsibilities. This raises the level in which designers communicate and discuss design decisions. In this sense, one ofthe potential benefits that the use of patterns brings to software development is the understanding and maintenance of designs.
Essentially, a design pattern expresses a design intent, suggesting a generic organization of classes and distribution of responsibilities among them, that solve a design problem. If a user has a design problem and knows which pattern intent to solve his problem, and what classes and methods the pattern prescribes. Then, the user can apply this pattern in his design making more reusable ones. Once the design has been finished, a11 methods prescribed by the pattern must be implemented. If a pattern was used more than one time in the same application, its methods must be implemented each time.