# Ontwerppatroon

Een ontwerppatroon of patroon (Engels: design pattern) in de informatica is een generiek opgezette softwarestructuur, die een bepaald veelvoorkomend type software-ontwerpprobleem oplost. Het patroon geeft geen concrete oplossing, maar biedt een soort sjabloon, waarmee het ontwerpprobleem kan worden aangepakt. In de wereld van het objectgeoriënteerd programmeren zal een ontwerppatroon eruitzien als een klassendiagram, waar de relatie tussen de verschillende klassen en objecten weergegeven wordt. Een ontwerppatroon is geen algoritme, omdat een algoritme een berekeningsprobleem oplost en geen ontwerpprobleem. Onderstaand artikel geeft uitleg over het meest gebruikte groep van patronen, die van de "gang of four". Voor andere patronen, zie GRASP. Naast ontwerppatronen zijn er in de loop van de tijd ook patronen ontstaan op het gebied van de informatiearchitectuur en voor het het beveiligen van informatie.

## Geschiedenis

De term 'design pattern' werd in 1977 geïntroduceerd door Christopher Alexander, emeritus-hoogleraar aan de University of California. Hij deed dat in het boek A Pattern Language: Towns, Buildings, Construction en beschreef daarin een ontwerpmethode voor architecten en stedenbouwkundigen. In 1994 namen Erich Gamma, Richard Helm, Ralph Johnson en John Vlissides, ook bekend als De Bende van Vier (Engels: The Gang of Four), dit concept over en pasten het toe in de softwareontwikkeling. Zij deden dat met het boek Design Patterns : Elements of Reusable Object-Oriented Software. Wat een ontwerppatroon nu precies is bleef 10 jaar lang een onderwerp van discussie.

## Gebruik

Het gebruiken van patronen versnelt het maken van bijvoorbeeld software, omdat beschikbare oplossingen direct kunnen worden hergebruikt. Hoewel oplossingen voor veelvoorkomende ontwerpproblemen bestaan, is het vaak lastig om deze toe te passen in andere situaties vanwege de details in de implementatie. Patronen zijn een generieke beschrijving die het voordeel bieden dat het oplossingspatroon herkenbaar is, ongeacht de implementatiedetails. De toepassing van ontwerppatronen verhoogt in potentie de kwaliteit van software omdat ontwerpen worden gemaakt die zich in de praktijk reeds hebben bewezen.

## Beschrijving

Er zijn in de literatuur veel verzamelingen van patronen verschenen. Daarbij is normaal geworden per patroon een beschrijving te geven waarin een aantal standaard onderdelen voorkomt. Als voorbeeld noemen we de "normale" onderdelen van softwarepatronen:

### Patroonnaam en Indeling

    Ieder patroon hoort voorzien te zijn van een unieke en beschrijvende naam waarmee het patroon geïdentificeerd wordt en waarnaar verwezen kan worden. Daarbij moet het patroon ook ingedeeld worden naar soort (zoals verderop beschreven) om het patroon nog makkelijk terug te kunnen vinden.

### Doel

    Een beschrijving van het doel van het patroon, het soort probleem dat het patroon oplost.

### Ook bekend als

    Eventueel andere namen voor hetzelfde patroon in de literatuur.

### Motivering

    Een probleembeschrijving met context waarop het patroon van toepassing is. Geeft een voorbeeld van wanneer men het patroon toe zou passen.

### Toepasbaarheid

    Geeft een algemeen idee over de situaties (de contexten) waarin het patroon van toepassing is.

### Structuur

    Een grafische weergave van de structuur van het patroon, bijvoorbeeld met behulp van klassendiagrammen en interactiediagrammen.

### Rollen

    Een opsomming van de klassen/objecten in het patroon en hun rol in het patroon.

### Collaboraties

    Beschrijft de interacties tussen de klassen en objecten in het patroon.

### Gevolgen

    Beschrijft de resultaten, neveneffecten en overwegingen die op gebruik van het patroon van toepassing zijn.

### Implementatie

    Beschrijft de implementatie van het patroon, met een bespreking van de technieken die daarvoor gebruikt worden.

### Voorbeeldcode

    Een voorbeeld van een implementatie van het patroon in een programmeertaal.

### Bekende toepassingen

    Voorbeelden van bekende situaties waarin het patroon toegepast is.

### Gerelateerde patronen

    Beschrijft patronen die verband houden met het huidige patroon en wat het verband is (bijvoorbeeld kan gebruikt worden in plaats van of kan samen gebruikt worden met). Beschrijft ook de verschillen met gelijkende patronen.

## Voorbeelden van ontwerppatronen uit de informatica

Hieronder volgt een opsomming van een aantal patronen, ingedeeld naar categorie.

### Fundamentele patronen

Patronen die het fundament vormen van object-georiënteerd ontwerp.
* Delegatie
* Functioneel Ontwerp
* Interface
* Proxy
* Immutabiliteit
* Vlaginterface

### Creatie

Patronen aangaande mechanismes om in programma's objecten aan te maken.
* Abstract Factory — Laat een object maken waarvan slechts de basisklasse bekend hoeft te zijn.
* Builder — Lijkt op een Abstract Factory, maar levert andere producten dan objecten.
* Factory — Een basisklasse laat het maken van geaggregeerde objecten over aan een subklasse.
* Prototype — Het maken van objecten door objecten te kopiëren.
* Singleton — Een klasse heeft slechts één instantie.

### Structuur

Patronen die de structuur van een programma moeten verbeteren, complexiteit tegen moeten gaan en programma's inzichtelijker moeten maken.
* Adapter
* Bridge
* Composite
* Decorator
* Façade
* Flyweight
* Proxy

### Gedrag

Patronen waarin een bepaald gedrag vastligt dat vaak voorkomt in programma's.
* Chain of responsibility
* Command
* Interpreter
* Iterator
* Mediator
* Memento
* Observer
* State
* Strategy
* Template method
* Visitor

## Andere patronen

Daarnaast worden er, door anderen, nog de volgende groepen van patronen beschreven.
* Gebeurtenispatronen (Engels: Event handling patterns)
* Architectuurpatronen (Engels: Architectural patterns)