added AbstractFactory Design Pattern