implementação com factory pattern