A system should be independent of how its objects and products are created. A set of related objects is designed to be used together. Hiding the implementations of a class library or product, revealing only their interfaces.