Object-Oriented Software Engineering Practical Software Development using UML and Java Chapter 6: Using Design Patterns.