Adding AbstractFactory Pattern