Design patterns elements of reusable object-oriented softwareErich Gamma [et.al.] (Addison-Wesley, 1995)