Designed to encapsulate the instantiation logic and to create objects without specifying their concrete classes. Some people argue if this is a pattern or not, but we will mention it, because it’s widely used.
Designed to provide a level of indirection to object members and may add additional logic (i.e. to control access or to provide a wrapper implementation for better performance)
Designed to to decouple sender and receiver and to allow multiple handler implementations, that can handle the request, especially when the concrete handler isn’t known a priori
Designed to encapsulate the data, needed to perform the action as an object, and execute the action. Sometimes action can be stored in a queue and executed later.
Designed to define one-to-many dependency between objects, so that when one object changes its state, all its dependents get notified and updated automatically
Designed to separate the behavior from it’s host class, by encapsulating the algorithm in a separate class. This allows you to implement many algorithms and make them interchangeable.