Introduced by Robert C. Martin
- Single Responsibility Principle
- Open-Closed Principle
- Liskov Substitution Principle
- Interface Segregation Principle
- Dependency Inversion Principle
- Object creation mechanisms, trying to create objects in a manner suitable to the situation.
- Singleton
- Factory
- Abstract Factory
- Builder
- Prototype
- Object composition: creating relationships between objects to form larger structures.
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- Object to Object communication and how they operate together.
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
- Monitor Object: Uses an object to synchronize access to a shared resource allowing multiple threas to access the resource safely.
- Read-Write Lock: Allows multiple threads to read a shared resource simultaneously, but limits access to a single thread when a write operation is being performed.
- Thread Pool: Creates a pool of worker threads that can be used to execute tasks concrrently.
- Future: Allows a thread to execute a task asynchronously and provdes a mechanism for the calling thread to retrieve the result at a later time.
- Producer-Consumer: Allows multiple threads to share common resources with one thread producing data and another consuming it.
- Guarded Suspension: Allows a thread to wait for a condition to be met before proceeding while still allowing other threads to access shared resources.
- Two-Phase Termination: Allows a thread to perform cleanup tasks when it is shutting down, while still allowing other threads to access shared resources.
- Balking: Allows a thread to cancel an operation if a condition is not met, while still allowing other threads to access shared resources. ?
- Thread-local storage: Allows each thread to have its own private data without the need for explicit synchronization.
- Double-checked locking: Optimizes the performance of a lock by performing a check before acquiring the lock, in order to avoid unnecessary synchronization.