Add Factory Pattern