Implement Abstract Factory Pattern and Tests