- Concrete objects are received as an argument to the functions rather than creating them internally
- Separating the concerns with object creation and the object being used
- Useful for situations where each implementation of an object has different constructor signatures