You can:
- Identify that there are operations that do not always need to be implemented in the same way.
You want to:
- Completely hide implementations from clients.
- Avoid binding an implementation to an abstraction directly.
- Change an implementation without even recompiling an abstraction.
- Combine different parts of a system at runtime.