add Factory Method Pattern