user factory-design-pattern