Design Patterns Elements Of Reusable Object Oriented Software - Gamma (Erich); And Others
20