abstract FactoryPattern