De 7 belangrijkste software-ontwerppatronen

Bekijk Software Design Patterns: Best Practices for Developers, gemaakt door C.H. voor een uitgebreide duik in het onderwerp Software Design Patterns. Afzal, een ervaren software-ingenieur met meerdere jaren ervaring bij Netflix, Microsoft en Oracle. Veel van het onderstaande is samengevat uit zijn cursus.

Waarom patronen ontwerpen?

Ontwerppatronen zijn de laatste tijd een onderwerp van enige controverse in de programmeerwereld geworden, grotendeels vanwege hun vermeende 'overmatig gebruik' dat leidt tot code die moeilijker te begrijpen en te beheren is.

Het is belangrijk om te begrijpen dat ontwerppatronen nooit bedoeld waren om snelkoppelingen bij elkaar te hacken om op een willekeurige, ‘one-size-fits-all’ manier op uw code te worden toegepast. Er is uiteindelijk geen vervanging voor echte probleemoplossende vaardigheden in software engineering.

Het feit blijft echter dat ontwerppatronen ongelooflijk nuttig kunnen zijn als ze in de juiste situaties en om de juiste redenen worden gebruikt. Wanneer ze strategisch worden gebruikt, kunnen ze een programmeur aanzienlijk efficiënter maken door hen in staat te stellen het spreekwoordelijke wiel niet opnieuw uit te vinden, in plaats daarvan met methoden die al door anderen zijn verfijnd. Ze bieden ook een nuttige gemeenschappelijke taal om herhaalde problemen en oplossingen te bedenken bij het bespreken met anderen of het beheren van code in grotere teams.

Dat gezegd hebbende, een belangrijk voorbehoud is ervoor te zorgen dat het hoe en het waarom achter elk patroon ook door de ontwikkelaar wordt begrepen.

Zonder verder oponthoud (in algemene volgorde van belangrijkheid, van meest naar minst):

De belangrijkste ontwerppatronen

  1. eenling

Het singleton-patroon wordt gebruikt om het maken van een klasse te beperken tot slechts één object. Dit is handig wanneer één (en slechts één) object nodig is om acties in het systeem te coördineren. Er zijn verschillende voorbeelden van waar slechts één instantie van een klasse zou moeten bestaan, inclusief caches, thread-pools en registers.

Het is triviaal om een ​​object van een klasse te initiëren, maar hoe zorgen we ervoor dat er maar één object wordt gemaakt? Het antwoord is om de constructor 'privé' te maken voor de klasse die we als een singleton willen definiëren. Op die manier hebben alleen de leden van de klas toegang tot de privéconstructeur en niemand anders.

Belangrijke overweging: het is mogelijk om een ​​singleton onder te classificeren door de constructor te beschermen in plaats van privé. Dit kan onder bepaalde omstandigheden geschikt zijn. Een benadering in deze scenario's is om een ​​register van singletons van de subklassen te maken en de methode getInstance kan een parameter opnemen of een omgevingsvariabele gebruiken om de gewenste singleton te retourneren. Het register onderhoudt vervolgens een toewijzing van stringnamen aan singleton-objecten, die indien nodig toegankelijk zijn.

2. Fabrieksmethode

Een normale fabriek produceert goederen; een softwarefabriek produceert objecten. En niet alleen dat - het doet dit zonder de exacte klasse van het te creëren object op te geven. Om dit te bereiken, worden objecten gemaakt door een fabrieksmethode aan te roepen in plaats van een constructor aan te roepen.

Gewoonlijk gebeurt het maken van objecten in Java als volgt:

SomeClass someClassObject = new SomeClass ();

Het probleem met de bovenstaande benadering is dat de code die het object van SomeClass gebruikt, nu plotseling afhankelijk wordt van de concrete implementatie van SomeClass. Er is niets mis met het gebruik van nieuwe om objecten te maken, maar het komt met de bagage van het nauw koppelen van onze code aan de concrete implementatieklasse, wat soms problematisch kan zijn.

3. Strategie

Het strategiepatroon maakt het mogelijk om gerelateerde algoritmen onder een abstractie te groeperen, waardoor het ene algoritme of beleid voor een ander kan worden uitgewisseld zonder de client te wijzigen. In plaats van direct een enkel algoritme te implementeren, ontvangt de code runtime-instructies die aangeven welke van de groep algoritmen moet worden uitgevoerd.

4. Waarnemer

Dit patroon is een één-op-veel afhankelijkheid tussen objecten, zodat alle afhankelijke personen op de hoogte worden gesteld wanneer een object van status verandert. Dit wordt meestal gedaan door een van hun methoden aan te roepen.

Denk voor de eenvoud na over wat er gebeurt als je iemand volgt op Twitter. Je vraagt ​​Twitter in wezen om jou (de waarnemer) tweet-updates te sturen van de persoon (het onderwerp) die je hebt gevolgd. Het patroon bestaat uit twee acteurs, de waarnemer die geïnteresseerd is in de updates en het onderwerp dat de updates genereert.

Een onderwerp kan veel waarnemers hebben en is een één op veel relatie. Een waarnemer kan zich echter ook abonneren op updates van andere onderwerpen. U kunt zich abonneren op de nieuwsfeed van een Facebook-pagina, die het onderwerp zou zijn en wanneer de pagina een nieuw bericht heeft, zou de abonnee het nieuwe bericht zien.

Belangrijke overweging: in het geval van veel onderwerpen en weinig waarnemers, als elk onderwerp zijn waarnemers afzonderlijk opslaat, verhoogt dit de opslagkosten omdat sommige onderwerpen dezelfde waarnemer meerdere keren opslaan.

5. Bouwer

Zoals de naam al aangeeft, wordt een bouwpatroon gebruikt om objecten te bouwen. Soms kunnen de objecten die we maken complex zijn, uit meerdere subobjecten bestaan ​​of een uitgebreid constructieproces vereisen. De oefening in het maken van complexe typen kan worden vereenvoudigd door het bouwerspatroon te gebruiken. Een samengesteld of geaggregeerd object is wat een bouwer doorgaans bouwt.

Belangrijke overweging: het bouwpatroon lijkt misschien op het patroon van de ‘abstracte fabriek’, maar een verschil is dat het bouwpatroon stap voor stap een object maakt, terwijl het abstracte fabriekspatroon het object in één keer retourneert.

6. Adapter

Hierdoor kunnen incompatibele klassen samenwerken door de interface van de ene klasse in een andere om te zetten. Zie het als een soort vertaler: wanneer twee staatshoofden die geen gemeenschappelijke taal spreken elkaar ontmoeten, zit er meestal een tolk tussen de twee en vertaalt het gesprek, waardoor communicatie mogelijk wordt.

Als u twee toepassingen hebt, waarbij de ene uitvoer als XML uitspuwt en de andere JSON-invoer vereist, hebt u een adapter tussen de twee nodig om ze naadloos te laten werken.

7. Staat

Het statuspatroon omvat de verschillende statussen waarin een machine zich kan bevinden, en laat een object zijn gedrag veranderen wanneer zijn interne status verandert. Aan de machine of de context, zoals deze in patroon-spreken wordt genoemd, kunnen acties worden ondernomen die hem in verschillende toestanden stuwen. Zonder het patroon te gebruiken, wordt de code inflexibel en bezaaid met voorwaardelijke voorwaarden.

Wil je blijven leren?

Met Software Design Patterns: Best Practices voor ontwikkelaars krijgt u de kans om meer te doen dan alleen de theorie te lezen. Je kunt diep in echte problemen duiken en praktische oplossingen begrijpen met voorbeelden uit de praktijk.

De cursus is gebaseerd op het populaire boek van de Gang of Four, maar gepresenteerd in een interactief, gemakkelijk te verteren formaat. Je beheerst de 23 beroemde ontwerppatronen uit het boek interactief, leert de juiste toepassingen van de 3 belangrijkste ontwerppatroontypen (creatief, structureel en gedragsmatig) en leert deze ontwerppatronen in je eigen projecten op te nemen.

Bekijk het nu.

Oorspronkelijk gepubliceerd op blog.educative.io op 7 november 2018.