software design patterns 9511843