Gamma, E.; Helm, R. & Johnson, R. E. (1995), Design Patterns. Elements of Reusable Object-Oriented Software. , Addison-Wesley Longman , Amsterdam .