Abstract Factory Pattern.