Add Abstract Factory Pattern