Et designmønster eller et designmønster ( engelsk designmønster ) i softwareudvikling er et repeterbart arkitektonisk design , som er en løsning på et designproblem inden for en ofte forekommende kontekst .
Typisk er en skabelon ikke et komplet eksempel, der direkte kan konverteres til kode ; dette er blot et eksempel på en problemløsning, der kan bruges i forskellige situationer. Objektorienterede mønstre viser relationer og interaktioner mellem klasser eller objekter uden at specificere, hvilke endelige klasser eller applikationsobjekter der skal bruges.
"Lavt-niveau" mønstre, der tager højde for de særlige forhold ved et bestemt programmeringssprog, kaldes idiomer . Det er gode designbeslutninger, der er specifikke for et bestemt sprog eller softwareplatform og derfor ikke universelle.
På højeste niveau er der arkitektoniske mønstre , der dækker arkitekturen af hele softwaresystemet .
Algoritmer er i sagens natur også mønstre, men ikke designmønstre, men beregninger , da de løser beregningsmæssige problemer.
I 1970'erne kompilerede arkitekt Christopher Alexander et sæt designmønstre. Inden for arkitekturen blev denne idé ikke udviklet så meget som senere inden for softwareudvikling.
I 1987 tog Kent Beck og Ward Cunningham Alexanders ideer og udviklede skabeloner til smalltalk GUI- udviklingssoftware .
I 1988 begyndte Erich Gamma at skrive sin doktorafhandling ved universitetet i Zürich om den generelle overførsel af denne teknik til softwareudvikling.
Mellem 1989 og 1991 arbejdede James Coplien på udviklingen af C++ programmeringssprog og udgav Advanced C++ Idioms i 1991.
Samme år afslutter Erich Gamma sin doktorafhandling og flytter til USA , hvor han i samarbejde med Richard Helm (Richard Helm), Ralph Johnson (Ralph Johnson) og John Vlissides (John Vlissides) udgiver bogen Design Patterns - Elementer af genbrugelig objektorienteret software . Denne bog beskriver 23 designmønstre. Også holdet af forfattere til denne bog er kendt af offentligheden under navnet "Gang of Four" ( eng. Gang of Four , ofte forkortet til GoF ). Det var denne bog, der forårsagede stigningen i popularitet af designmønstre.
I forhold til helt selvstændigt design har skabeloner en række fordele. Den største fordel ved at bruge skabeloner er at reducere kompleksiteten af udvikling gennem færdige abstraktioner for at løse en hel klasse af problemer. Skabelonen giver løsningen sit navn, hvilket letter kommunikationen mellem udviklere ved at tillade referencer til velkendte skabeloner. På grund af skabeloner er detaljerne i løsninger således samlet: moduler, projektelementer, og antallet af fejl reduceres. Anvendelse af skabeloner er konceptuelt beslægtet med at bruge færdige kodebiblioteker. Et velformuleret designmønster gør det muligt, efter at have fundet en god løsning, at bruge det igen og igen. Et sæt skabeloner hjælper udvikleren med at vælge den mulige, mest passende designmulighed. [en]
Mens let ændring af kode, så den passer til et kendt mønster, kan gøre kode lettere at forstå, er der ifølge Steve McConnell to problemer med at bruge mønstre. For det første kan det føre til programkompleksitet at følge et eller andet valgt mønster blindt. For det andet kan en udvikler blive fristet til at prøve et bestemt mønster uden nogen særlig grund (se Golden Hammer ). [2]
Mange designmønstre i objektorienteret design kan opfattes som idiomatiske reproduktioner af elementer af funktionelle sprog [3] . Peter Norvig hævder, at 16 af de 23 mønstre beskrevet i Gangs of Four er meget nemmere at implementere i dynamisk indtastede sprog end i C++ eller er usynlige [4] . Paul Graham anser selve ideen med designmønstre for at være et antimønster , et signal om, at systemet ikke har et tilstrækkeligt abstraktionsniveau , og det skal omhyggeligt omarbejdes [5] . Det er let at se, at selve definitionen af en skabelon som " en færdiglavet løsning, men ikke et direkte opkald til et bibliotek " i det væsentlige betyder afvisning af genbrug til fordel for duplikering . Dette kan naturligvis være uundgåeligt for komplekse systemer, når man bruger sprog, der ikke understøtter kombinatorer og type polymorfi , og det kan i princippet udelukkes i sprog, der har egenskaben homoikonicitet (dog ikke nødvendigvis effektivt), da ethvert mønster kan implementeres i eksekverbar kode [6] .
Navn | oprindelige navn | Beskrivelse | Beskrevet i Design Patterns |
---|---|---|---|
Grundlæggende skabeloner (grundlæggende) | |||
Delegationsmønster | delegationsmønster | Et objekt udtrykker eksternt en eller anden adfærd, men overfører i virkeligheden ansvaret for at udføre denne adfærd til et tilknyttet objekt. | n/a |
funktionel design skabelon | funktionelt design | Sikrer, at hvert modul i et computerprogram kun har ét ansvar og udfører det med et minimum af bivirkninger på andre dele af programmet. | n/a |
Uforanderlig grænseflade | Uforanderlig grænseflade | Oprettelse af et uforanderligt objekt . | n/a |
Interface | Interface | En generel metode til at strukturere computerprogrammer, så de er nemmere at forstå. | n/a |
Interface markør | Markør interface | Som en attribut (som et mærke for en enhed) bruges tilstedeværelsen eller fraværet af en implementering af markørgrænsefladen. Moderne programmeringssprog kan bruge attributter eller anmærkninger i stedet for. | n/a |
Ejendomsbeholder | ejendomscontainer | Giver dig mulighed for at tilføje yderligere egenskaber for klassen til containeren (inden for klassen) i stedet for at udvide klassen med nye egenskaber. | n/a |
Event-kanal | begivenhedskanal | Udvider mønsteret Udgiv/Abonner for at skabe en centraliseret kanal til begivenheder. Bruger en proxy til at abonnere og en proxy til at offentliggøre begivenheden på kanalen. Repræsentanten eksisterer separat fra den faktiske udgiver eller abonnent. En abonnent kan modtage offentliggjorte begivenheder fra mere end én enhed, selvom den kun er registreret på én kanal. | n/a |
Kreative mønstre er designmønstre, der abstraherer processen med instansiering. De gør det muligt at gøre systemet uafhængigt af metoden til at skabe, komponere og præsentere objekter. Skabelonen, der genererer klasser, bruger arv til at ændre den klasse, der instansieres, mens skabelonen, der genererer objekter, uddelegerer instansieringen til et andet objekt. | |||
Abstrakt fabrik | abstrakt fabrik | En klasse, der repræsenterer en grænseflade til oprettelse af systemkomponenter. | Ja |
Bygger | Bygger | En klasse, der repræsenterer en grænseflade til at skabe et komplekst objekt. | Ja |
fabriksmetode | fabriksmetode | Definerer en grænseflade til oprettelse af et objekt, men overlader det til underklasser at bestemme, hvilken klasse der skal instansieres. | Ja |
Doven initialisering | Doven initialisering | Et objekt, der initialiseres første gang, det tilgås. | Ikke |
Multitone | Multitone | Sikrer, at klassen har navngivne objektforekomster og giver dem et globalt adgangspunkt. | Ikke |
Objekt pool | objektpulje | En klasse, der repræsenterer en grænseflade til at arbejde med et sæt initialiserede og klar til brug objekter. | Ikke |
Prototype | prototype | Definerer en grænseflade til at skabe et objekt ved at klone et andet objekt i stedet for at skabe det gennem en konstruktør. | Ja |
Ressourceanskaffelse er initialisering | Ressourceanskaffelse er initialisering (RAII) | At få en ressource er kombineret med initialisering og frigivelse - med ødelæggelse af objektet. | Ikke |
enspænder | Singleton | En klasse, der kun kan have én instans. | Ja |
Strukturelle skabeloner (Strukturelle) definerer forskellige komplekse strukturer, der ændrer grænsefladen af eksisterende objekter eller implementeringen af dem, hvilket gør det nemmere at udvikle og optimere programmet. | |||
Adapter | Adapter/Wrapper | Et objekt, der tillader to andre objekter at interagere, hvoraf den ene bruger og den anden giver en grænseflade, der er inkompatibel med den første. | Ja |
Bro | Bro | En struktur, der giver dig mulighed for at ændre opkaldsgrænsefladen og klasseimplementeringsgrænsefladen uafhængigt. | Ja |
linker | Sammensatte | Et objekt, der kombinerer objekter, der ligner sig selv. | Ja |
Dekoratør eller Indpakning | dekoratør | En klasse, der udvider funktionaliteten af en anden klasse uden at bruge arv. | Ja |
Facade | facade | Et objekt, der abstraherer arbejde med flere klasser ved at kombinere dem til en enkelt enhed. | Ja |
Enkelt indgangssted | front controller | Giver en samlet grænseflade til grænseflader i et undersystem. Frontcontrolleren definerer en grænseflade på højt niveau, der forenkler brugen af undersystemet. | Ikke |
opportunist | Fluevægt | Dette er et objekt, der præsenterer sig selv som en unik instans forskellige steder i programmet, men som faktisk ikke er det. | Ja |
Stedfortræder | proxy | Et objekt, der formidler mellem to andre objekter, og som implementerer/begrænser adgangen til det objekt, der tilgås gennem det. | Ja |
Adfærdsmønstre definerer interaktionen mellem objekter og øger dermed dens fleksibilitet . | |||
Kæde af ansvar | Ansvarskæde | Designet til at organisere ansvarsniveauerne i systemet. | Ja |
Kommando , handling, transaktion | kommando | Repræsenterer en handling. Kommandoobjektet indeholder selve handlingen og dens parametre. | Ja |
Tolk | tolk | Løser et almindeligt, men med forbehold for ændringer, problem. | Ja |
Iterator , markør | Iterator | Repræsenterer et objekt, der giver dig mulighed for at få sekventiel adgang til elementerne i det samlede objekt uden at bruge beskrivelser af hvert af de objekter, der er en del af aggregeringen. | Ja |
Mægler | mægler | Giver interaktion mellem mange objekter, samtidig med at de danner løs kobling og eliminerer behovet for, at objekter eksplicit henviser til hinanden. | Ja |
Målmanden | Memento | Tillader, uden at krænke indkapslingen , at rette og gemme de interne tilstande af et objekt, så det senere kan gendannes i disse tilstande. | Ja |
Nul objekt | Nul objekt | Forhindrer null pointers ved at angive et "standard" objekt. | Ikke |
Observatør eller udgiver-abonnent | Observatør | Definerer en en-til-mange-afhængighed mellem objekter, således at når tilstanden for et objekt ændres, får alle afhængige af det besked om hændelsen. | Ja |
Tjener | Tjener | Bruges til at give fælles funktionalitet til en gruppe klasser. | Ikke |
Specifikation | Specifikation | Bruges til at binde forretningslogik. | Ikke |
Stat | Stat | Det bruges i de tilfælde, hvor objektet under afviklingen af programmet skal ændre sin adfærd afhængigt af dets tilstand. | Ja |
Strategi | Strategi | Det er beregnet til at definere en familie af algoritmer, indkapsle hver af dem og sikre deres udskiftelighed. | Ja |
skabelon metode | skabelon metode | Definerer grundlaget for algoritmen og giver efterkommere mulighed for at omdefinere nogle trin i algoritmen uden at ændre dens struktur som helhed. | Ja |
Besøgende | Besøgende | Beskriver en operation, der udføres på objekter af andre klasser. Når besøgsklassen ændres, er der ingen grund til at ændre de servicerede klasser. | Ja |
Simpel politik | simpel politik | Ikke | |
begivenheds lytter | begivenheds lytter | Ikke | |
Engangsbesøger | Enkelttjenende besøgende | Optimerer implementeringen af besøgsmønsteret, som initialiseres, bruges én gang og derefter bortskaffes. | Ikke |
Hierarkisk besøgende | Hierarkisk besøgende | Giver en måde at krydse alle hjørner af en hierarkisk datastruktur (f.eks. træ). | Ikke |
Samtidighed - Samtidighed
Bruges til at skrive flertrådede programmer mere effektivt og levere direkte løsninger til synkroniseringsproblemer .
Navn | oprindelige navn | Beskrivelse |
---|---|---|
Aktivt objekt | aktivt objekt | Tjener til at adskille tråden for udførelse af en metode fra tråden, hvor den blev kaldt. Bruger den asynkrone metodeopkalds- og planlægningsmønstre. |
Balking | Balking | Bruges til kun at udføre en handling på et objekt, når det er i den korrekte tilstand. |
Bindende egenskaber | Kombinerer flere observatører for at holde egenskaber synkroniseret på tværs af forskellige objekter [7] . | |
Beskeder | Messaging-mønster, Messaging-designmønster (MDP) | Tillader komponenter og applikationer at udveksle information (meddelelser). |
Dobbelttjek blokering | Dobbelttjekket låsning | Designet til at reducere omkostningerne forbundet med at få en lås. |
Hændelsesbaseret | Hændelsesbaseret asynkron | Løsning af problemer med det asynkrone mønster, der opstår i programmer med flere tråde [8] . |
Bevogtet ophæng | Bevogtet ophæng | Bruges til kun at blokere udførelsen af en handling på et objekt, når det er i den korrekte tilstand. |
Halv synk/halv asynkron | ||
Ledere/følgere | ||
blokering | låse | Én tråd låser en ressource for at forhindre andre tråde i at få adgang til eller ændre den [9] . |
Overvåge | Overvåge | En genstand beregnet til at blive brugt sikkert af mere end én tråd. |
Reaktor | Reaktor | Designet til synkron transmission af anmodninger til tjenesten fra en eller flere kilder. |
Læse/ | Læse/skrivelås | Tillader flere tråde at læse information fra det delte lager på samme tid, men tillader kun én tråd ad gangen at ændre den. |
Planlægger | Planlægger | Giver en mekanisme til at implementere en planlægningspolitik uden at være afhængig af nogen bestemt politik. |
trådpulje | Giver en pulje af tråde til behandling af job, normalt repræsenteret som en kø. | |
Trådspecifik opbevaring | Tjener til at give forskellige globale variabler for forskellige tråde. | |
Enkeltgevind udførelse | enkelt tråd udførelse | Forhindrer en metode i at blive kaldt samtidig, og forhindrer derved, at metoden udføres samtidigt. |
Samarbejdsmønster | samarbejdsmønster | Giver en mekanisme til sikkert at stoppe udførelsestråde ved at bruge et fælles flag til at signalere trådafslutning. |
Også i dag findes der en række andre skabeloner.
Design mønstre | |
---|---|
Hoved | |
Generativ | |
Strukturel | |
Adfærdsmæssigt | |
Parallel programmering |
|
arkitektonisk |
|
Java EE skabeloner | |
Andre skabeloner | |
Bøger | |
Personligheder |