Design patterns Elemets of reusable object - oriented software - Gamma, Erich (Addison - Wesley, 1995)