[2] Gamma, E., Helm, R., et al. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995