Factory Method and Abstract Factory pattern