Added Abstract Factory Pattern