May 5, 2014

Further Design Patterns

Once you have understood the SOLID principles, you can see how these apply to real life problems and solutions. During software development we come across the same problems time and time again. Luckily, very clever people have also come across these same problems and have defined solutions for us to use in our everyday coding.

These common problems are largely based upon the SOLID principles and form an ever growing library of design patterns. These are the solutions to common problems. They also give us a common language to discuss problems with other architects and developers.

I have created a list of design patterns including the Gang of Four patterns and other patterns which I have found useful over the years.

The Gang of Four are Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides. They wrote a book called Design Patterns: Elements of re-usable object-orientated software back in the 90s. These patterns have been considerably built upon over the years by people such as Martin Fowler and others.

The patterns associated with the GoF are:

Creational

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.

Structural

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.

Behavioural

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 behaviour when it’s 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 behaviour.
  • Visitor separates an algorithm from an object structure by moving the hierarchy of methods into one object.

Other patterns that I have found useful and that have all come up in interviews are:

  • Dispose pattern allows us to dispose of classes that utilise non managed objects.
  • Equals pattern allows us to compare the values of properties of two classes of the same type.
  • Consumer and producer pattern is used to create a queue of tasks and then execute these tasks using multi-threaded reader. This is great for streaming data.
  • Command Query Responsibility Segregation allows for very fast reading of a database and still maintains a rich domain model for validating and updating data.

This is a good list to get you started and provides a rich set of tools for daily coding.

Simon Powers
Simon Powers is an Agile Coach specialising in large scale transformations and agile adoption. He has a background in very large enterprise architecture which has led on to organisational design and agile process refinement. Simon is the founder of Adventures with Agile.