add Factory Pattern and Abstract Factory