Ett designmönster eller mönster ( engelsk design pattern ) i mjukvaruutveckling är en repeterbar arkitektonisk design , som är en lösning på ett designproblem inom något ofta förekommande sammanhang .
Vanligtvis är en mall inte ett komplett exempel som direkt kan konverteras till kod ; detta är bara ett exempel på en problemlösning som kan användas i olika situationer. Objektorienterade mönster visar relationer och interaktioner mellan klasser eller objekt utan att specificera vilka slutliga klasser eller applikationsobjekt som ska användas.
"Lågnivå"-mönster som tar hänsyn till specifikationerna för ett visst programmeringsspråk kallas idiom . Dessa är bra designbeslut som är specifika för ett visst språk eller mjukvaruplattform och därför inte universella.
På den högsta nivån finns det arkitektoniska mönster som täcker arkitekturen för hela mjukvarusystemet .
Algoritmer är till sin natur också mönster, men inte designmönster, utan beräkningar , eftersom de löser beräkningsproblem.
På 1970 -talet sammanställde arkitekten Christopher Alexander en uppsättning designmönster. Inom arkitekturområdet utvecklades inte denna idé lika mycket som senare inom området mjukvaruutveckling.
1987 tog Kent Beck och Ward Cunningham Alexanders idéer och utvecklade mallar för utvecklingsprogramvara för smalltalk GUI .
1988 började Erich Gamma skriva sin doktorsavhandling vid universitetet i Zürich om den allmänna portabiliteten av denna teknik till mjukvaruutveckling.
Mellan 1989 och 1991 arbetade James Coplien med utvecklingen av C++ programmeringsspråk och publicerade Advanced C++ Idiom 1991.
Samma år avslutar Erich Gamma sin doktorsavhandling och flyttar till USA , där han i samarbete med Richard Helm (Richard Helm), Ralph Johnson (Ralph Johnson) och John Vlissides (John Vlissides) ger ut boken Design Patterns - Element av återanvändbar objektorienterad programvara . Den här boken beskriver 23 designmönster. Dessutom är gruppen av författare till denna bok känt för allmänheten under namnet "Gang of Four" ( eng. Gang of Four , ofta förkortat till GoF ). Det var den här boken som orsakade den ökande populariteten för designmönster.
Jämfört med helt oberoende design har mallar en rad fördelar. Den största fördelen med att använda mallar är att minska komplexiteten i utvecklingen genom färdiga abstraktioner för att lösa en hel klass av problem. Mallen ger lösningen dess namn, vilket underlättar kommunikationen mellan utvecklare genom att tillåta referenser till välkända mallar. På grund av mallar är detaljerna i lösningar enhetliga: moduler, projektelement och antalet fel minskar. Att tillämpa mallar är konceptuellt besläktat med att använda färdiga kodbibliotek. Ett välformulerat designmönster gör att man, efter att ha hittat en bra lösning, kan använda den om och om igen. En uppsättning mallar hjälper utvecklaren att välja det möjliga, lämpligaste designalternativet. [ett]
Även om enkel modifiering av kod för att passa ett känt mönster kan göra koden lättare att förstå, enligt Steve McConnell finns det två problem med att använda mönster. För det första, att blint följa något valt mönster kan leda till programkomplexitet. För det andra kan en utvecklare bli frestad att prova ett visst mönster utan någon speciell anledning (se Golden Hammer ). [2]
Många designmönster i objektorienterad design kan ses som idiomatiska reproduktioner av element i funktionella språk [3] . Peter Norvig hävdar att 16 av de 23 mönster som beskrivs i Gangs of Four är mycket lättare att implementera i dynamiskt typade språk än i C++ eller är osynliga [4] . Paul Graham anser själva idén med designmönster vara ett antimönster , en signal om att systemet inte har en tillräcklig abstraktionsnivå , och det måste omarbetas noggrant [5] . Det är lätt att se att själva definitionen av en mall som " en färdig lösning, men inte ett direkt anrop till ett bibliotek " i huvudsak innebär avslag på återanvändning till förmån för dubbelarbete . Detta kan uppenbarligen vara oundvikligt för komplexa system när man använder språk som inte stöder kombinatorer och typpolymorfism , och det kan i princip uteslutas i språk som har egenskapen homoikonicitet (även om det inte nödvändigtvis är effektivt), eftersom vilket mönster som helst kan implementeras i körbar kod [6] .
namn | ursprungliga namn | Beskrivning | Beskrivs i Design Patterns |
---|---|---|---|
Grundläggande mallar (grundläggande) | |||
Delegationsmönster | delegationsmönster | Ett objekt uttrycker externt något beteende, men överför i realiteten ansvaret för att utföra detta beteende till ett associerat objekt. | n/a |
funktionell designmall | funktionell design | Säkerställer att varje modul i ett datorprogram endast har ett ansvar och utför det med ett minimum av biverkningar på andra delar av programmet. | n/a |
Oföränderligt gränssnitt | Oföränderligt gränssnitt | Skapa ett oföränderligt objekt . | n/a |
Gränssnitt | Gränssnitt | En generell metod för att strukturera datorprogram så att de är lättare att förstå. | n/a |
Gränssnittsmarkör | Markör gränssnitt | Som ett attribut (som ett märke för en entitet) används närvaron eller frånvaron av en implementering av markörgränssnittet. Moderna programmeringsspråk kan använda attribut eller anteckningar istället. | n/a |
Fastighetsbehållare | fastighetscontainer | Låter dig lägga till ytterligare egenskaper för klassen i behållaren (inom klassen), istället för att utöka klassen med nya egenskaper. | n/a |
Eventkanal | händelsekanal | Utökar publicerings-/prenumerationsmönstret för att skapa en centraliserad kanal för evenemang. Använder en proxy för att prenumerera och en proxy för att publicera händelsen på kanalen. Representanten existerar separat från den faktiska utgivaren eller prenumeranten. En abonnent kan ta emot publicerade händelser från mer än en enhet, även om den är registrerad på endast en kanal. | n/a |
Kreativa mönster är designmönster som abstraherar instansieringsprocessen. De gör det möjligt att göra systemet oberoende av metoden att skapa, komponera och presentera objekt. Mallen som genererar klasser använder arv för att modifiera klassen som instansieras, medan mallen som genererar objekt delegerar instansieringen till ett annat objekt. | |||
Abstrakt fabrik | abstrakt fabrik | En klass som representerar ett gränssnitt för att skapa systemkomponenter. | Ja |
Byggare | Byggare | En klass som representerar ett gränssnitt för att skapa ett komplext objekt. | Ja |
fabriksmetod | fabriksmetod | Definierar ett gränssnitt för att skapa ett objekt, men överlåter till underklasser att bestämma vilken klass som ska instansieras. | Ja |
Lat initiering | Lat initiering | Ett objekt som initieras första gången det öppnas. | Inte |
Flerton | Flerton | Säkerställer att klassen har namngivna objektinstanser och tillhandahåller en global åtkomstpunkt till dem. | Inte |
Objekt pool | objektpool | En klass som representerar ett gränssnitt för att arbeta med en uppsättning initierade och färdiga att använda objekt. | Inte |
Prototyp | prototyp | Definierar ett gränssnitt för att skapa ett objekt genom att klona ett annat objekt istället för att skapa det genom en konstruktor. | Ja |
Resursförvärv är initiering | Resursförvärv är initiering (RAII) | Att erhålla någon resurs kombineras med initiering och frigöring - med förstörelse av objektet. | Inte |
enstöring | Singleton | En klass som bara kan ha en instans. | Ja |
Strukturella mallar (Structural) definierar olika komplexa strukturer som ändrar gränssnittet för befintliga objekt eller dess implementering, vilket gör det lättare att utveckla och optimera programmet. | |||
Adapter | Adapter/Wrapper | Ett objekt som tillåter två andra objekt att interagera, varav det ena använder och det andra ger ett gränssnitt som är inkompatibelt med det första. | Ja |
Bro | Bro | En struktur som låter dig ändra anropsgränssnittet och klassimplementeringsgränssnittet oberoende av varandra. | Ja |
länk | Sammansatt | Ett objekt som kombinerar objekt som liknar sig självt. | Ja |
Dekoratör eller omslag | dekoratör | En klass som utökar funktionaliteten för en annan klass utan att använda arv. | Ja |
Fasad | Fasad | Ett objekt som abstraherar arbete med flera klasser genom att kombinera dem till en enda enhet. | Ja |
Enskild ingångspunkt | främre kontroller | Ger ett enhetligt gränssnitt för gränssnitt i ett delsystem. Front Controller definierar ett högnivågränssnitt som förenklar användningen av delsystemet. | Inte |
opportunistisk | Flugvikt | Detta är ett objekt som presenterar sig som en unik instans på olika platser i programmet, men som faktiskt inte är det. | Ja |
Vice | ombud | Ett objekt som förmedlar mellan två andra objekt och som implementerar/begränsar åtkomst till objektet som nås genom det. | Ja |
Beteendemönster definierar interaktionen mellan objekt, vilket ökar dess flexibilitet. | |||
Ansvarskedja | Ansvarskedja | Designad för att organisera ansvarsnivåerna i systemet. | Ja |
Kommando , åtgärd, transaktion | kommando | Representerar en åtgärd. Kommandoobjektet innehåller själva åtgärden och dess parametrar. | Ja |
Tolk | tolk | Löser ett vanligt, men kan komma att ändras, problem. | Ja |
Iterator , Markör | Iterator | Representerar ett objekt som låter dig få sekventiell åtkomst till elementen i det aggregerade objektet utan att använda beskrivningar av vart och ett av objekten som ingår i aggregeringen. | Ja |
Medlare | medlare | Ger växelverkan mellan många objekt, samtidigt som den bildar lös koppling och eliminerar behovet av att objekt explicit hänvisar till varandra. | Ja |
Målvakten | Minne | Tillåter, utan att bryta inkapsling , att fixa och spara de interna tillstånden för ett objekt så att det senare kan återställas i dessa tillstånd. | Ja |
Null objekt | Null objekt | Förhindrar nollpekare genom att tillhandahålla ett "standardobjekt". | Inte |
Observatör eller utgivare-prenumerant | Observatör | Definierar ett ett-till-många-beroende mellan objekt så att när tillståndet för ett objekt ändras, meddelas alla beroende av det om händelsen. | Ja |
tjänare | Tjänare | Används för att tillhandahålla gemensamma funktioner till en grupp klasser. | Inte |
Specifikation | Specifikation | Används för att binda affärslogik. | Inte |
stat | stat | Det används i de fall då objektet under körningen av programmet måste ändra sitt beteende beroende på dess tillstånd. | Ja |
Strategi | Strategi | Det är avsett att definiera en familj av algoritmer, kapsla in var och en av dem och säkerställa deras utbytbarhet. | Ja |
mallmetoden | mallmetoden | Definierar grunden för algoritmen och tillåter avkomlingar att omdefiniera några steg i algoritmen utan att ändra dess struktur som helhet. | Ja |
Besökare | Besökare | Beskriver en operation som utförs på objekt av andra klasser. När besöksklassen ändras behöver du inte ändra de betjänade klasserna. | Ja |
Enkel policy | enkel policy | Inte | |
evenemangslyssnare | evenemangslyssnare | Inte | |
Engångsbesökare | Engångsbesökare | Optimerar implementeringen av besöksmönstret, som initieras, används en gång och sedan kasseras. | Inte |
Hierarkisk besökare | Hierarkisk besökare | Ger ett sätt att korsa alla hörn i en hierarkisk datastruktur (t.ex. träd). | Inte |
Samtidighet - Samtidighet
Används för att skriva flertrådade program mer effektivt och tillhandahålla direkta lösningar på synkroniseringsproblem .
namn | ursprungliga namn | Beskrivning |
---|---|---|
Aktivt objekt | aktivt objekt | Används för att separera exekveringstråden för en metod från tråden där den anropades. Använder den asynkrona metoden anrops- och schemaläggningsmönster. |
Balking | Balking | Används för att utföra en åtgärd på ett objekt endast när det är i rätt tillstånd. |
Bindande egenskaper | Kombinerar flera observatörer för att hålla egenskaper synkroniserade över olika objekt [7] . | |
Meddelanden | Meddelandemönster, meddelandedesignmönster (MDP) | Tillåter komponenter och applikationer att utbyta information (meddelanden). |
Dubbelkolla lås | Dubbelkollad låsning | Utformad för att minska omkostnader i samband med att skaffa ett lås. |
Händelsebaserad | Händelsebaserad asynkron | Att lösa problem med det asynkrona mönstret som uppstår i program med flera trådar [8] . |
Bevakad upphängning | Bevakad fjädring | Används för att blockera exekvering av en åtgärd på ett objekt endast när det är i rätt tillstånd. |
Halvsynk/halvasynkron | ||
Ledare/följare | ||
blockering | låsa | En tråd låser en resurs för att förhindra att andra trådar kommer åt eller ändrar den [9] . |
Övervaka | Övervaka | Ett föremål avsett att användas säkert av mer än en tråd. |
Reaktor | Reaktor | Designad för synkron överföring av förfrågningar till tjänsten från en eller flera källor. |
Läs/ | Läs/skrivlås | Tillåter flera trådar att läsa information från den delade lagringen samtidigt, men tillåter bara en tråd åt gången att ändra den. |
Schemaläggare | Schemaläggare | Tillhandahåller en mekanism för att implementera en schemaläggningspolicy utan att vara beroende av någon särskild policy. |
trådpool | Tillhandahåller en pool av trådar för bearbetning av jobb, vanligtvis representerad som en kö. | |
Trådspecifik lagring | Fungerar för att tillhandahålla olika globala variabler för olika trådar. | |
Enkeltrådad utförande | enkeltrådsutförande | Förhindrar att en metod anropas samtidigt, vilket förhindrar att metoden körs samtidigt. |
Samarbetsmönster | kooperativa mönster | Tillhandahåller en mekanism för att säkert stoppa exekveringstrådar genom att använda en gemensam flagga för att signalera trådavslutning. |
Även idag finns det ett antal andra mallar.
Design mönster | |
---|---|
Main | |
Generativ | |
Strukturell | |
Beteende | |
Parallell programmering |
|
arkitektonisk |
|
Java EE-mallar | |
Andra mallar | |
Böcker | |
Personligheter |