• 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