change structure of the project as AbstractFactory pattern