add Factory pattern