abstract design pattern example - shapes