Beprövade lösningar på återkommande problem inom objektorienterad mjukvaruutveckling, illustrerade med praktiska kodexempel i fyra språk.
En introduktion till designmönstrets historia, kategorier och varför de är ett oumbärligt verktyg för varje professionell utvecklare.
Säkerställer att en klass bara har en instans och ger en global åtkomstpunkt till den. Vanligt för databasanslutningar och konfigurationshanterare.
Definierar ett gränssnitt för att skapa objekt men låter underklasser bestämma vilken klass som ska instansieras.
Skapar familjer av relaterade objekt utan att specificera deras konkreta klasser — garanterar att produkter från samma familj används tillsammans.
Konstruerar komplexa objekt steg för steg via tydliga byggmetoder — eliminerar konstruktorer med tiotals parametrar och separerar skapande från representation.
Kopierar befintliga objekt utan att göra koden beroende av deras klasser — billigare än att skapa komplexa objekt från grunden.
Tillhandahåller ett förenklat gränssnitt till ett komplext delsystem av klasser, bibliotek eller ramverk.
Låter objekt med inkompatibla gränssnitt samarbeta — konverterar XML till JSON, gamla API:er till nya format.
Delar upp en klass i abstraktion och implementation så att de kan utvecklas oberoende — undviker kombinatorisk explosion av underklasser.
Komponerar objekt i trädstrukturer för del-helhet-hierarkier — låter klienter behandla enskilda objekt och sammansatta grupper på exakt samma sätt.
Lägger till nytt beteende till ett objekt dynamiskt genom att linda in det i dekoratörobjekt — ett flexibelt alternativ till arv för att kombinera funktionalitet fritt vid runtime.
Ryms fler objekt i minnet genom att dela gemensamt tillstånd mellan instanser — avgörande när ett program skapar hundratusentals liknande objekt.
Tillhandahåller ett substitut för ett annat objekt och kontrollerar åtkomsten till det — möjliggör lazy initialization, caching och behörighetskontroll.
Skickar en begäran längs en kedja av hanterare — varje hanterare avgör om den ska bearbeta begäran eller skicka den vidare.
Omvandlar en begäran till ett självständigt objekt — möjliggör köning, loggning och ångra-operationer.
Låter dig traversera elementen i en samling sekventiellt utan att exponera dess underliggande representation — stödjer flera traverseringsstrategier för samma samling.
Minskar kaotiska beroenden mellan objekt genom att tvinga dem att kommunicera via ett centralt mediatorobjekt istället för direkt med varandra.
Sparar och återställer ett objekts tidigare tillstånd utan att avslöja implementationsdetaljer — grunden för undo/redo och transaktioner.
Definierar en prenumerationsmekanism för att notifiera flera objekt om händelser som inträffar i objektet de observerar.
Låter ett objekt ändra sitt beteende när dess interna tillstånd förändras — eliminerar stora villkorsblock och isolerar tillståndslogiken i egna klasser.
Låter dig definiera en familj av algoritmer, kapsla in var och en av dem och göra dem utbytbara vid körning.
Definierar skelettet för en algoritm i en basklassmetod och låter underklasser överskugga specifika steg — utan att ändra algoritmens övergripande struktur.
Separerar algoritmer från de objekt de opererar på — lägg till nya operationer till en objektstruktur utan att ändra klasserna.