design pattern abstract factory formated