Guideline: Using Patterns
This guidance discusses the practical application of patterns in a project.
Relationships
Main Description

In software design, it is primarily the development method and not the pattern and its pattern language that influences the process of pattern selection and use. As discussed in Concept: Patterns, Alexander developed the concept of generative pattern languages to guide a designer’s application of individual patterns to the entire design. In software design, however, as Alexander observed [OOP96] there is little evidence of using generative pattern languages.

For iterative development methods, software patterns and pattern languages support the development method through their ability to be applied incrementally, or by piecemeal growth, and by providing extensible structures. From an architectural perspective, these two qualities allow software architecture to be designed and refactored incrementally, thus so avoid the need for a so-called "big, up-front design."

Piecemeal growth

The term piecemeal growth, as it applies to patterns, originates in Alexander's work. It refers to a top-down design process in which a design starts from a high-level structure that is embellished or refined through the implementation of lower-level patterns. For software development, this corresponds to using hierarchies of architectural and design patterns and idioms like those proposed by Buschmann et. al. [BUS96]. Using the idea of piecemeal growth, an architect can start with one or more architectural patterns to provide an architectural vision for the design, and then progressively extend the design using design patterns. For example, an interactive application may use the Model-View-Controller pattern as its architectural vision, then during implementation the Command pattern may be selected to implement the Controller component.

Extensibility

A key aspect of object oriented design patterns is their ability to support extension without causing the rewriting of existing code. This feature allows a bottom up approach to the design process through code refactoring. When a problem is encountered during coding such as duplicate code, the developer can weighed up various patterns and their tradeoffs and select the appropriate solution in the context of the application.

More Information