added an abstract factory example