Design Patterns : Elements of Reusable Object-Oriented Software - Gamma, Erich (Addison-Wesley, 1995)