a study of object oriented design patterns