Allows behavior to be dynamically added to individual objects without modifying their code, promoting flexibility and adherence to the open/closed principle.
Provides an interface for creating objects in a superclass, but allows subclasses to alter the type of objects that will be created, promoting flexibility and reusability in object creation.
Encapsulates the logic for accessing and managing data sources, providing a centralized interface for data operations while promoting separation of concerns and improving testability.