add factoryMethod Pattern