* add factoryPattern