Dat Abstract Factory Pattern