+implemented Abstract Factory pattern