Erich Gamma Richard Helm Ralph Johnson John Vlissides - Design Patterns Elements of Reusable Object-Oriented Software - 1994