add the conception of factory