A new book on design patterns needs to be able to distinguish itself from the dozens of releases in this topic since the astonishing success of Design patterns: elements of reusable object-oriented software [1], by Gamma, Helm, Johnson, and Vlissides. In this book, Goldfedder has brought together his experience on consultancy and development of enterprise systems in order to create a book tailored to software industry practitioners.
The author starts by defining design patterns as a general approach to guide the design activity, referencing its roots in architectural design studies by Alexander [2], as well as reporting his personal experience on unintentional identification of patterns in his early days of software development. By relying on the empathy of readers, who have probably noticed recurring structures or behaviors in their own projects, Goldfedder provides a nearly effortless introduction of the design pattern concept. The pattern forms--sets of features that explain each pattern, its motivation and usage--are also well explained, though the examples used to illustrate such features are too abstract, and may not be fully understood by a reader who is not familiar with software architecture design.
The introduction to design patterns is followed by a section about the basic concepts of object-orientation, their implementation by programming languages, and their modeling in Unified Modeling Language. While useful for some readers without object-orientation background, that section is misplaced: some of the concepts presented here are needed in order to understand previous chapters. Readers, both object-orientation novices and those with experience, would benefit more from those concepts if they were blended into the introductory part instead of being in a separate section.
The remaining sections present several patterns applied to more complex, practical cases. The alternatives for pattern implementation using different programming languages are also explored, with sample code in C++, Java, and Visual Basic. The examples given are suitable for use in hands-on workshops where a tutor can go through the code with the students, but the lack of comments in the code makes it difficult for the lone student to understand.
In conclusion, the book succeeds in introducing the concepts of design patterns to software practitioners. Its format and style make it ideal as study material for workshops, seminars and on-the-job training. However, if a deeper analysis on the topic is needed--for an undergraduate or graduate course, for instance--there are better options available.