---
title: "Software design patterns"
source: Awesome Developing (JPH)
source_url: https://github.com/joelparkerhenderson/awesome-developing
licence: CC0-1.0
domain: leadership-and-culture
subdomain: jph-awesome-developing
date_added: 2026-04-25
---

# Software design patterns

* [Abstract factory](https://wikipedia.org/wiki/Abstract_factory_pattern): Provide an interface for creating families of related or dependent objects.
* [Abstraction principle](https://wikipedia.org/wiki/Abstraction_principle_(programming))
* [Active object](https://wikipedia.org/wiki/Active_object): Decouple method execution from method invocation that reside in their own thread of control.
* [Active record](https://wikipedia.org/wiki/Active_record_pattern)
* [Adapter](https://wikipedia.org/wiki/Adapter_pattern): Convert the interface of a class into another interface clients expect.
* [Aggregate](https://wikipedia.org/wiki/Aggregate_pattern) object sequentially without exposing its underlying representation.
* [Algorithmic skeleton](https://wikipedia.org/wiki/Algorithmic_skeleton)
* [Anti-pattern](https://wikipedia.org/wiki/Anti-pattern)
* [Architectural pattern](https://wikipedia.org/wiki/Architectural_pattern_(computer_science))
* [Artificial intelligence](https://wikipedia.org/wiki/Artificial_intelligence)
* [Balking](https://wikipedia.org/wiki/Balking_pattern): Only execute an action on an object when the object is in a particular state.
* [Binding properties](https://wikipedia.org/wiki/Binding_properties_pattern): Combine multiple observers to force properties in different objects to be coordinated.
* [Blackboard](https://wikipedia.org/wiki/Blackboard_design_pattern): Artificial intelligence pattern for combining disparate sources of data.
* [Blockchain](https://wikipedia.org/wiki/Blockchain_(database)): Decentralize storage of data and agree on ways of processing it.
* [Bridge](https://wikipedia.org/wiki/Bridge_pattern): Decouple an abstraction from its implementation allowing the two to vary independently.
* [Builder](https://wikipedia.org/wiki/Builder_pattern): Separate the construction of a complex object from its representation.
* [Business delegate](https://wikipedia.org/wiki/Business_delegate_pattern)
* [Cache access patterns](TODO)
* [Chain of responsibility](https://wikipedia.org/wiki/Chain_of_responsibility_pattern): Chain event-receiving objects in order to pass a request along the chain until an object handles it.
* [Circuit-breaker](TODO)
* [Command](https://wikipedia.org/wiki/Command_pattern): Encapsulate a request as an object.
* [Composite entity](https://wikipedia.org/wiki/Composite_entity_pattern): Compose objects into tree structures to represent part-whole hierarchies.
* [Composite](https://wikipedia.org/wiki/Composite_pattern)
* [Concurrency pattern](https://wikipedia.org/wiki/Concurrency_pattern)
* [Creational pattern](https://wikipedia.org/wiki/Creational_pattern)
* [Data access object](https://wikipedia.org/wiki/Data_access_object)
* [Data transfer object](https://wikipedia.org/wiki/Data_transfer_object)
* [Debugging patterns](https://wikipedia.org/wiki/Debugging_patterns)
* [Decorator](https://wikipedia.org/wiki/Decorator_pattern): Attach additional responsibilities to an object dynamically keeping the same interface. 
* [Dependency injection](https://wikipedia.org/wiki/Dependency_injection)
* [Design pattern](https://wikipedia.org/wiki/Design_pattern)
* [Distributed design patterns](https://wikipedia.org/wiki/Distributed_design_patterns)
* [Double-chance function](https://wikipedia.org/wiki/Double-chance_function)
* [Double-checked locking](https://wikipedia.org/wiki/Double-checked_locking): Reduce the overhead of acquiring a lock by first testing the locking criterion.
* [EDA: Event-driven architecture a.ka. message-driven architecture (MDA)](https://en.wikipedia.org/wiki/Event-driven_architecture)
* [Enterprise Architecture framework](https://wikipedia.org/wiki/Enterprise_Architecture_framework)
* [Event-based asynchronous](https://wikipedia.org/wiki/Asynchronous_method_invocation): Address problems with asynchronous patterns that occur in multithreaded programs.
* [Extension object](TODO): Add functionality to a hierarchy without changing the hierarchy.
* [Facade](https://wikipedia.org/wiki/Facade_pattern): Provide a unified interface to a set of interfaces in a subsystem. 
* [Factory method](https://wikipedia.org/wiki/Factory_method_pattern): Define an interface to create an object, but let subclasses decide which class to instantiate. 
* [Fault tolerance access patterns](TODO)
* [Flyweight](https://wikipedia.org/wiki/Flyweight_pattern): Use sharing to support large numbers of similar objects efficiently.
* [Front controller](https://wikipedia.org/wiki/Front_controller): Provide a centralized entry point for handling requests.
* [General Responsibility Assignment Software Patterns (GRASP)](https://wikipedia.org/wiki/GRASP_(object-oriented_design))
* [GRASP (object-oriented design)](https://wikipedia.org/wiki/GRASP_(object-oriented_design))
* [Guarded suspension](https://wikipedia.org/wiki/Guarded_suspension): Manage operations that first require both a lock and a precondition.
* [Helper class](https://wikipedia.org/wiki/Helper_class)
* [Identity map](https://wikipedia.org/wiki/Identity_map_pattern)
* [Interaction design pattern](https://wikipedia.org/wiki/Interaction_design_pattern)
* [Intercepting filter](https://wikipedia.org/wiki/Intercepting_filter_pattern)
* [Interceptor](https://wikipedia.org/wiki/Interceptor_pattern)
* [Interpreter](https://wikipedia.org/wiki/Interpreter_pattern): Represent a language's grammar and how to interpret sentences.
* [Inversion of control](https://wikipedia.org/wiki/Inversion_of_control)
* [Iterator](https://wikipedia.org/wiki/Iterator_pattern): Provide a way to access the elements of an aggregate object sequentially.
* [Join](https://wikipedia.org/wiki/Join-pattern): Provide a way to write concurrent, parallel and distributed programs by message passing.
* [Lazy initialization](https://wikipedia.org/wiki/Lazy_initialization): Tactic of delaying the creation of an object, the calculation of a value, or some other expensive process until the first time it is needed. 
* [Lazy loading](https://wikipedia.org/wiki/Lazy_loading)
* [Lock](https://wikipedia.org/wiki/Lock_pattern): Put a "lock" on a resource, preventing other objects from accessing or modifying it.
* [Marker](https://wikipedia.org/wiki/Marker_interface_pattern): Empty interface to associate metadata with a class.
* [Mediator](https://wikipedia.org/wiki/Mediator_pattern): Promote loose coupling by keeping objects from referring to each other explicitly.
* [Memento](https://wikipedia.org/wiki/Memento_pattern): Capture and externalize an object's internal state, enabling the object to be restored to this state later.
* [Messaging design pattern (MDP)](https://wikipedia.org/wiki/Messaging_pattern): Enable interchange of information (i.e. messages) between components.
* [Mock object](https://wikipedia.org/wiki/Mock_object)
* [Module](https://wikipedia.org/wiki/Module_pattern): Group related elements, such as classes and methods, into a single conceptual entity.
* [Monitor](https://wikipedia.org/wiki/Monitor_(synchronization)): An object whose methods are subject to mutual exclusion, thus preventing multiple objects from erroneously trying to use it at the same time.
* [Multi-tier architecture a.k.a. n-tier architecture](https://wikipedia.org/wiki/Multitier_architecture)
* [Multiton](https://wikipedia.org/wiki/Multiton_pattern): Ensure a class has only named instances, and provide a global point of access to them.
* [MVC: Model-View-Controller](https://wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)
* [Naked objects](https://wikipedia.org/wiki/Naked_objects)
* [Null object](https://wikipedia.org/wiki/Null_object_pattern): Provide a default object, so as to avoid null references.
* [Object pool](https://wikipedia.org/wiki/Object_pool_pattern): Avoid expensive acquisition and release of resources by recycling objects that are no longer in use.
* [Observer](https://wikipedia.org/wiki/Observer_pattern): Define how a state change in one object results in dependents being notified and updated.
* [Pattern language](https://wikipedia.org/wiki/Pattern_language)
* [Pattern theory](https://wikipedia.org/wiki/Pattern_theory)
* [Pedagogical patterns](https://wikipedia.org/wiki/Pedagogical_patterns)
* [Portland Pattern Repository](https://wikipedia.org/wiki/Portland_Pattern_Repository)
* [Proactor](https://wikipedia.org/wiki/Proactor_pattern)
* [Prototype](https://wikipedia.org/wiki/Prototype_pattern): Create new objects from the skeleton of an existing object.
* [Proxy](https://wikipedia.org/wiki/Proxy_pattern): Provide a surrogate or placeholder for another object to control access to it.
* [Publish–subscribe a.k.a. pubsub](https://wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern): Define a one-to-many dependency between objects where a state change in one object results in all its dependents being notified and updated automatically.
* [Reactor](https://wikipedia.org/wiki/Reactor_pattern): Provide an asynchronous interface to resources that must be handled synchronously.
* [Read-write lock](https://wikipedia.org/wiki/Read/write_lock_pattern): Allows concurrent read access to an object, but requires exclusive access for write operations.
* [Refactoring](https://wikipedia.org/wiki/Refactoring)
* [Resource acquisition is initialization](https://wikipedia.org/wiki/Resource_Acquisition_Is_Initialization): Ensure resources are released by tying them to the lifespan of objects.
* [Scheduler](https://wikipedia.org/wiki/Scheduler_pattern): Explicitly control when threads may execute single-threaded code.
* [Servant](https://wikipedia.org/wiki/Servant_(design_pattern)): Define common functionality for a group of classes.
* [Service locator](https://wikipedia.org/wiki/Service_locator_pattern)
* [Service to service access patterns](TODO)
* [Singleton](https://wikipedia.org/wiki/Singleton_pattern): Ensure a class has only one instance, and provide a global point of access to it.
* [SOA: Service-oriented architecture](https://en.wikipedia.org/wiki/Service-oriented_architecture)
* [Software design pattern](https://wikipedia.org/wiki/Software_design_pattern)
* [Software development methodology](https://wikipedia.org/wiki/Software_development_methodology)
* [Specification](https://wikipedia.org/wiki/Specification_pattern): Recombinable business logic in a Boolean fashion.
* [State](https://wikipedia.org/wiki/State_pattern): Allow an object to alter its behavior when its internal state changes.
* [Strategy](https://wikipedia.org/wiki/Strategy_pattern): Define a family of algorithms, encapsulate each one, and make them interchangeable.
* [Structural pattern](https://wikipedia.org/wiki/Structural_pattern)
* [Template method](https://wikipedia.org/wiki/Template_method_pattern): Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.
* [Thread pool](https://wikipedia.org/wiki/Thread_pool_pattern): A number of threads are created to perform a number of tasks.
* [Thread-local storage](https://wikipedia.org/wiki/Thread-local_storage)
* [Thread-specific storage](https://wikipedia.org/wiki/Thread-Specific_Storage): Static or "global" memory local to a thread.
* [Twin](https://wikipedia.org/wiki/Twin_pattern): Model multiple inheritance in programming languages that do not support this feature.
* [Type tunnel](https://wikipedia.org/wiki/Type_Tunnel_pattern)
* [Visitor](https://wikipedia.org/wiki/Visitor_pattern): Represent an operation to be performed on the elements of an object structure.
