Ensure only one instance exists
Define interface for creating objects
Create families of related objects
Construct complex objects step by step
Clone existing objects
Convert interface of one class to another
Separate abstraction from implementation
Compose objects into tree structures
Add responsibilities dynamically
Simplified interface to complex subsystem
Share common state between objects
Placeholder for another object
Sequential access to elements
Notify dependents of state changes
Define family of interchangeable algorithms
Encapsulate request as object
Object behavior changes with state
Define algorithm skeleton, defer steps
Add operations to object structure
Centralize complex communications
Capture and restore object state
Pass request along chain of handlers
Define a grammar and interpret sentences in the language - DSLs, expression parsers, rule engines