The Repository design pattern, like the Object By Value design pattern (Chapter 6), requires the cooperation of persistable objects in order to be successful. However, unlike the Object By Value design pattern, the Repository design pattern doesn't require the client to have knowledge of how to produce a persisted data stream package. This is completely encapsulated by the repository. The Repository design pattern also shares attributes with the Object Factory design pattern (Chapter 8) because it abstracts the object creation process from the client code when retrieving an object from an underlying data store. You could define a repository interface for persisting a specific type of object. Each implementation can persist to a different type of data store, but the type of object to be created will remain static.