Designmønstre for begyndere: Øvelser der bringer teorien til live

Designmønstre for begyndere: Øvelser der bringer teorien til live

Designmønstre kan virke som et tørt og teoretisk emne, når man først støder på dem i en bog eller et kursus. Men i virkeligheden er de praktiske redskaber, der hjælper udviklere med at skrive mere fleksibel, genanvendelig og vedligeholdelsesvenlig kode. For at forstå dem rigtigt, skal man ikke bare læse om dem – man skal bruge dem. Her får du en introduktion til, hvordan du som begynder kan arbejde med designmønstre gennem små, konkrete øvelser, der bringer teorien til live.
Hvad er et designmønster?
Et designmønster er en gennemprøvet løsning på et tilbagevendende problem i softwareudvikling. Det er ikke en færdig opskrift, men snarere en skabelon, du kan tilpasse din egen situation. Mønstrene hjælper dig med at tænke i struktur og ansvar – hvordan klasser, objekter og funktioner spiller sammen.
De mest kendte mønstre er beskrevet i bogen Design Patterns: Elements of Reusable Object-Oriented Software fra 1994, ofte kaldet “Gang of Four”-bogen. Her opdeles mønstrene i tre hovedkategorier:
- Skabelsesmønstre – handler om, hvordan objekter oprettes (f.eks. Singleton og Factory Method).
- Strukturelle mønstre – beskriver, hvordan klasser og objekter kombineres (f.eks. Adapter og Decorator).
- Adfærdsmønstre – fokuserer på, hvordan objekter samarbejder (f.eks. Observer og Strategy).
Øvelse 1: Singleton – når der kun skal være én
Et klassisk begynderprojekt er at implementere et Singleton-mønster. Det bruges, når du kun vil have én instans af en klasse – for eksempel en logfilhåndtering eller en databaseforbindelse.
Sådan gør du: Lav en klasse, der repræsenterer en logger. Sørg for, at den kun kan instantieres én gang, og at alle dele af programmet bruger den samme instans. Test derefter, at to forskellige dele af koden faktisk peger på det samme objekt.
Hvad du lærer: Du får en fornemmelse af, hvordan man styrer objektlivscyklus og sikrer global adgang uden at miste kontrol. Øvelsen viser også, hvorfor man skal være forsigtig med global tilstand – et vigtigt princip i moderne softwaredesign.
Øvelse 2: Observer – når objekter skal reagere på ændringer
Forestil dig, at du laver et lille vejrudsigtsprogram. Når temperaturen ændrer sig, skal flere dele af systemet – f.eks. en app, et display og en log – opdateres automatisk. Her kommer Observer-mønstret ind i billedet.
Sådan gør du: Lav en klasse, der repræsenterer vejrudsigten, og lad den have en liste af “observatører”. Hver gang data ændres, kaldes en metode på alle observatørerne. Du kan starte med simple print-udskrifter og senere udvide til grafiske elementer.
Hvad du lærer: Du ser, hvordan løs kobling mellem komponenter gør systemet mere fleksibelt. Nye observatører kan tilføjes uden at ændre den eksisterende kode – et centralt princip i objektorienteret design.
Øvelse 3: Strategy – når adfærd skal kunne skiftes
Et andet nyttigt mønster for begyndere er Strategy. Det bruges, når du vil kunne skifte en algoritme ud uden at ændre resten af programmet – for eksempel forskellige måder at sortere data på.
Sådan gør du: Lav en klasse, der håndterer en liste af tal. Giv den mulighed for at bruge forskellige “strategier” til at sortere – f.eks. boblesortering, quicksort eller en simpel indbygget metode. Strategien vælges ved at give et objekt som parameter.
Hvad du lærer: Du opdager, hvordan man kan udskifte funktionalitet dynamisk og undgå store “if-else”-blokke. Det gør koden mere overskuelig og lettere at udvide.
Øvelse 4: Decorator – når du vil udvide funktionalitet uden at ændre koden
Decorator-mønstret er ideelt, når du vil tilføje funktioner til et objekt uden at ændre dets oprindelige kode. Det bruges ofte i brugergrænseflader, hvor du f.eks. vil tilføje rammer, farver eller effekter til et element.
Sådan gør du: Lav en simpel klasse, der repræsenterer en tekstboks. Opret derefter “dekorationer” som klasser, der kan tilføje ekstra funktioner – f.eks. en ramme eller en skygge – ved at pakke den oprindelige tekstboks ind.
Hvad du lærer: Du får en forståelse for, hvordan man kan bygge fleksible systemer, hvor funktionalitet kan kombineres som byggeklodser. Det er en teknik, der ofte bruges i moderne frameworks og UI-biblioteker.
Sådan får du mest ud af øvelserne
Når du arbejder med designmønstre, handler det ikke om at kunne dem udenad, men om at forstå, hvornår de giver mening. Prøv at:
- Eksperimentere – lav små projekter, hvor du bevidst bruger et mønster.
- Reflektere – spørg dig selv, om mønstret gjorde koden bedre eller mere kompleks.
- Sammenligne – prøv at løse det samme problem både med og uden mønster.
- Læse andres kode – mange open source-projekter bruger designmønstre i praksis.
Jo mere du øver dig, desto mere naturligt bliver det at genkende mønstre i andres kode og bruge dem i din egen.
Fra teori til praksis
Designmønstre er ikke magiske løsninger, men værktøjer, der hjælper dig med at tænke som en arkitekt frem for en håndværker. Når du først begynder at se mønstrene i det, du bygger, bliver de en del af din intuitive værktøjskasse.
Start småt, vær nysgerrig, og brug øvelserne som en måde at gøre teorien levende på. Det er sådan, du går fra at kende mønstrene – til virkelig at forstå dem.















