Design patterns are general solutions to common problems seen in software development. They provide a way to describe and communicate the issue, and create a common vocabulary for design; they nor, however, specific to any particular language, nor are they required - they are solutions to existing problems, not solutions looking for a problem.

There are four primary types of design patters:

Creational Patterns

Creational patterns deal with the creation of objects. Their primary goal is to abstract the instantiation process, thus making the system independent of how objects are created, composed, and represented. In other words, we can use this type of pattern to hide those complexities and allow for easier modification of the object creation logic.

Singleton

Factory

Abstract Factory

Builder

Prototype

Structural Patterns

Structural patterns deal with the class structure of a program, such as OOP Inheritance and Composition. Their focus is on how objects are put together to build more complex systems; in particular, they help organize classes and objects into larger structures and often help define relationships between entities.

Adapter

Composite

Proxy

Flyweight

Facade

Bridge

Decorator

Behavioral Patterns

Behavioral patterns provide solutions for the interaction between objects, providing loose coupling and flexibility (see SOLID). In particular they are concerned with the algorithms and assignment of responsibility amongst those objects, and how to define efficient, flexible, and loosely coupled communication channels without creating strict dependencies on concrete implementations.

Template Method

Mediator

Chain of Responsibility

Observer

Strategy

Command

Visitor

Iterator

Memento

State

Resources