add Abstract Factory Pattern