Instances of classes will generally be obtained through other interfaces using techniques such as the Factory pattern.
However, some caution is warranted – merely splitting an application into arbitrary components communicating via interfaces does not in itself guarantee low coupling or high cohesion, two other attributes that are commonly regarded as key for maintainability.
An interface-based architecture can be used when third parties – or indeed separate teams within the same organisation – develop additional components or plugins for an established system.
and both the manufacturer and third parties making their own mobile phone chargers that comply with this standard interface specification.
The problem is that if an interface is changed, e.g. by adding a new method, old code written to implement the interface will no longer compile – and in the case of dynamically loaded or linked plugins, will either fail to load or link, or crash at runtime.