create abstract factory pattern