AbstractFactory Pattern implemented