An important part of Software Engineering is having an understanding of design patterns, and being able to apply them appropriately.
I have separated out anti-patterns, that is patterns that do more harm than good, into its own page, but it is important to note that many patterns could be considered either a pattern or an anti-pattern depending on the context in which they are used.
Over the next few months I will adding more and more content to build up a large collection of patterns along with advise for appropriate usages.
|Active Object||Decouples method execution from method invocation that reside in their own thread of control. The goal is to introduce concurrency, by using asynchronous method invocation and a scheduler for handling requests.|
|Balking||Only execute an action on an object when the object is in a particular state.|
|Binding properties||Combining multiple observers to force properties in different objects to be synchronized or coordinated in some way.|
|Double-checked locking||Reduce the overhead of acquiring a lock by first testing the locking criterion (the ‘lock hint’) in an unsafe manner; only if that succeeds does the actual lock proceed.Can be unsafe when implemented in some language/hardware combinations. It can therefore sometimes be considered an anti-pattern.|
|Event-based asynchronous||Addresses problems with the asynchronous pattern that occur in multithreaded programs.|
|Guarded suspension||Manages operations that require both a lock to be acquired and a precondition to be satisfied before the operation can be executed.|
|Join||Join-patterns provides a way to write concurrent, parallel and distributed programs by message passing. Compared to the use of threads and locks, this is a high level programming model.|
|Lock||One thread puts a “lock” on a resource, preventing other threads from accessing or modifying it.|
|Messaging design pattern (MDP)||Allows the interchange of information (i.e. messages) between components and applications.|
|Monitor object||An object whose methods are subject to mutual exclusion, thus preventing multiple objects from erroneously trying to use it at the same time.|
|Reactor||A reactor object provides an asynchronous interface to resources that must be handled synchronously.|
|Read-write lock||Allows concurrent read access to an object, but requires exclusive access for write operations.|
|Scheduler||Explicitly control when threads may execute single-threaded code.|
|Thread pool||A number of threads are created to perform a number of tasks, which are usually organized in a queue. Typically, there are many more tasks than threads. Can be considered a special case of the object pool pattern.|
|Thread-specific storage||Static or “global” memory local to a thread.|
Gang of Four Patterns
Creational patterns are ones that create objects for you, rather than having you instantiate objects directly. This gives your program more flexibility in deciding which objects need to be created for a given case.
- Abstract Factory groups object factories that have a common theme.
- Builder constructs complex objects by separating construction and representation.
- Factory Method creates objects without specifying the exact class to create.
- Prototype creates objects by cloning an existing object.
- Singleton restricts object creation for a class to only one instance.
These concern class and object composition. They use inheritance to compose interfaces and define ways to compose objects to obtain new functionality.
- Adapter allows classes with incompatible interfaces to work together by wrapping its own interface around that of an already existing class.
- Bridge decouples an abstraction from its implementation so that the two can vary independently.
- Composite composes zero-or-more similar objects so that they can be manipulated as one object.
- Decorator dynamically adds/overrides behaviour in an existing method of an object.
- Facade provides a simplified interface to a large body of code.
- Flyweight reduces the cost of creating and manipulating a large number of similar objects.
- Proxy provides a placeholder for another object to control access, reduce cost, and reduce complexity.
Most of these design patterns are specifically concerned with communication between objects.
- Chain of responsibility delegates commands to a chain of processing objects.
- Command creates objects which encapsulate actions and parameters.
- Interpreter implements a specialized language.
- Iterator accesses the elements of an object sequentially without exposing its underlying representation.
- Mediator allows loose coupling between classes by being the only class that has detailed knowledge of their methods.
- Memento provides the ability to restore an object to its previous state (undo).
- Observer is a publish/subscribe pattern which allows a number of observer objects to see an event.
- State allows an object to alter its behavior when its internal state changes.
- Strategy allows one of a family of algorithms to be selected on-the-fly at runtime.
- Template method defines the skeleton of an algorithm as an abstract class, allowing its subclasses to provide concrete behavior.
- Visitor separates an algorithm from an object structure by moving the hierarchy of methods into one object.