Design petterns Elements of reusable object-oriented software - Gamma Erich (Addison-Wesley Professional Computing series, 1995)