El GoF describe 23 patrones, clasificados según tres propósitos FIXME: (all of which revolve around the particular aspect that can vary):
1. Creacional: Cómo se puede crear un objeto. Habitualmente esto incluye aislar los detalles de la creación del objeto, de forma que su código no dependa de los tipos de objeto que hay y por lo tantok, no tenga que cambiarlo cuando añada un nuevo tipo de objeto. Este capítulo presenta los patrones Singleton, Fábricas (Factories), y Constructor (Builder).
2. Estructural: Esto afecta a la manera en que los objetos se conectan con otros objetos para asegurar que los cambios del sistema no requieren cambiar esas conexiones. Los patrones estructurales suelen imponerlos las restricciones del proyecto. En este capítulo verá el Proxy y el Adaptador (Adapter).
3. Comportacional: Objetos que manejan tipos particulares de
acciones dentro de un programa. Éstos encapsulan procesos que quiere
que se ejecuten, como interpretar un lenguaje, completar una petición,
moverse a través de una secuencia (como en un iterador) o implementar
un algoritmo. Este capítulo contiene ejemplos de Comando
(Command), Método Plantilla (Template Method), Estado (State),
Estrategia (Strategy), Cadena de Responsabilidad (Chain of
Responsibility), Observador (Observer), FIXME: Despachador Múltiple
(Multiple Dispatching) y Visitador (Visitor).
El GoF incluye una sección sobre cada uno de los 23 patrones, junto con uno o más ejemplos de cada uno, típicamente en C++ aunque a veces en SmallTalk. Este libro no repite los detalles de los patrones mostrados en GoF, ya que aquél FIXME: "stands on its own" y debería estudiarse aparte. La descripción y los ejemplos que se dan aquí intentan darle una visión de los patrones, de forma que pueda hacerse una idea de lo que tratan y de porqué son importantes.
El trabajo va más allá de lo que se muestra en el libro del GoF. Desde su publicación, hay más patrones y un proceso más refinado para definir patrones de diseño.[135] Esto es importante porque no es fácil identificar nuevos patrones ni describirlos adecuadamente. Hay mucha confusión en la literatura popular acerca de qué es un patrón de diseño, por ejemplo. Los patrones no son triviales, ni están representados por características implementadas en un lenguaje de programación. Los constructores y destructores, por ejemplo, podrían llamarse el patrón de inicialización garantizada y el de limpieza. Hay constructores importantes y esenciales, pero son características del lenguaje rutinarias, y no son lo suficientemente ricas como para ser consideradas patrones.
Otro FIXME: (no-ejemplo? anti-ejemplo?) viene de varias formas de agregación. La agregación es un principio completamente fundamental en la programación orientada a objetos: se hacen objetos a partir de otros objetos. Aunque a veces, esta idea se clasifica erróneamente como un patrón. Esto no es bueno, porque contamina la idea del patrón de diseño, y sugiere que cualquier cosa que le sorprenda la primera vez que la ve debería convertirse en un patrón de diseño.
El lenguaje Java da otro ejemplo equivocado: Los diseñadores de la especificación de JavaBeans decidieron referirse a la notación get/set como un patrón de diseño (por ejemplo, getInfo() devuelve una propiedad Info y setInfo() la modifica). Esto es únicamente una convención de nombrado, y de ninguna manera constituye un patrón de diseño.