Design patterns Elenents of reusable object-oriented software - Gamma Erich (1995)