Design Patterns: Elements Of Reusable Object Oriented Software - Gamma (Erich); Helm (Richard)
25