Design Patterns: Elements of Reusable Object-Oriented Software - Gamma, E; Helm, R; Johnson, R; Vlissides, JM (Addison-Wesley Professional Computing Series, 1994)