dependency injection with factory pattern