add AbstractFactory pattern