Introductie
Ontwerppatronen zijn erg populair onder softwareontwikkelaars. Een ontwerppatroon is een goed beschreven oplossing voor een veelvoorkomend softwareprobleem.
Enkele voordelen van het gebruik van ontwerppatronen zijn:
- Ontwerppatronen zijn al gedefinieerd en bieden een industriestandaard benadering voor het oplossen van een terugkerend probleem, dus het bespaart tijd als we verstandig gebruik maken van het ontwerppatroon. Er zijn veel Java-ontwerppatronen die we kunnen gebruiken in onze op Java gebaseerde projecten.
- Het gebruik van ontwerppatronen bevordert herbruikbaarheid wat leidt tot meer robuste en zeer onderhoudbare code. Het helpt bij het verminderen van de totale eigendomskosten (TCO) van het softwareproduct.
- Aangezien ontwerppatronen al gedefinieerd zijn, maakt het onze code gemakkelijk te begrijpen en te debuggen. Het leidt tot snellere ontwikkeling en nieuwe teamleden begrijpen het gemakkelijk.
Java-ontwerppatronen zijn verdeeld in drie categorieën – creatieve, structurele, en gedrags ontwerppatronen.
Deze artikel dient als een index voor alle Java-ontwerppatroon artikelen.
Creatieve Ontwerppatronen
Creational design patterns bieden oplossingen om een Object
op de best mogelijke manier te instantiëren voor specifieke situaties.
1. Singleton Patroon
Het singleton-patroon beperkt de instantiatie van een Class
en zorgt ervoor dat slechts één exemplaar van de klasse bestaat in de Java Virtual Machine. De implementatie van het singleton-patroon is altijd een controversieel onderwerp geweest onder ontwikkelaars.
Opmerking: Lees meer over het Singleton-ontwerppatroon.
2. Fabriekspatroon
Het fabrieksontwerppatroon wordt gebruikt wanneer we een superklasse hebben met meerdere subklassen en op basis van invoer moeten we een van de subklassen retourneren. Dit patroon haalt de verantwoordelijkheid voor de instantiatie van een Class
weg bij het clientprogramma naar de fabrieksklasse. We kunnen een singleton-patroon toepassen op de fabrieksklasse of de fabrieksmethode static
maken.
Opmerking: Lees meer over het Fabrieksontwerppatroon.
3. Abstract Factory Pattern
De abstracte fabriekspatroon is vergelijkbaar met het fabriekspatroon en is een fabriek van fabrieken. Als je bekend bent met het fabriekspatroon in Java, zul je opmerken dat we een enkele fabrieksklasse hebben die verschillende subklassen retourneert op basis van de ingevoerde gegevens. De fabrieksklasse gebruikt hiervoor if-else
– of switch
-verklaringen. In het abstracte fabriekspatroon elimineren we het if-else
-blok en hebben we een fabrieksklasse voor elke subklasse. Vervolgens hebben we een abstracte fabrieksklasse die de subklasse retourneert op basis van de invoerfabrieksklasse.
Opmerking: Leer meer over het Abstract Factory Pattern.
4. Builder Pattern
Het bouwerpatroon is geïntroduceerd om enkele problemen op te lossen met de fabrieks- en abstracte fabriekspatronen wanneer het object veel attributen bevat. Dit patroon lost het probleem op met een groot aantal optionele parameters en inconsistente status door een manier te bieden om het object stapsgewijs op te bouwen en een methode te geven die daadwerkelijk het uiteindelijke Object
retourneert.
Opmerking: Lees meer over het Builder-patroon.
5. Prototype-patroon
Het prototypepatroon wordt gebruikt wanneer de creatie van een Object
kostbaar is en veel tijd en middelen vereist, en je al een vergelijkbaar Object
hebt dat bestaat. Dit patroon biedt dus een mechanisme om het originele Object
naar een nieuw Object
te kopiëren en het vervolgens aan te passen aan onze behoeften. Dit patroon gebruikt Java-klonen om het Object
te kopiëren. Het prototype-ontwerppatroon vereist dat het Object
dat je kopieert de kopieerfunctie moet bieden. Dit mag niet door een andere klasse worden gedaan. Of echter een oppervlakkige of diepe kopie van de objecteigenschappen moet worden gebruikt, hangt af van de vereisten en is een ontwerpbepaling.
Opmerking: Lees meer over het Prototype-patroon.
Structurele ontwerppatronen
Structuurontwerppatronen bieden verschillende manieren om een Class
-structuur te creëren (bijvoorbeeld door overerving en compositie te gebruiken om een groot Object
te maken van kleine Object
s).
1. Adapterpatroon
Het adapterontwerppatroon is een van de structuurontwerppatronen en wordt gebruikt zodat twee niet-verwante interfaces samen kunnen werken. Het object dat deze niet-verwante interfaces verbindt, wordt een adapter genoemd.
Opmerking: Lees meer over het Adapterpatroon.
2. Composietpatroon
Het composietpatroon wordt gebruikt wanneer we een deel-geheel hiërarchie moeten voorstellen. Wanneer we een structuur moeten creëren op een manier dat de objecten in de structuur op dezelfde manier moeten worden behandeld, kunnen we het composietontwerppatroon toepassen.
Opmerking: Lees meer over het Composietpatroon.
3. Proxy Patroon
Het proxy-patroon biedt een plek voor een ander Object
om de toegang ertoe te controleren. Dit patroon wordt gebruikt wanneer we gecontroleerde toegang tot functionaliteit willen bieden.
Opmerking: Lees meer over het Proxy Patroon.
4. Flyweight Patroon
Het flyweight-ontwerppatroon wordt gebruikt wanneer we veel Object
s van een Class
moeten maken. Omdat elk Object
geheugenruimte verbruikt die cruciaal kan zijn voor apparaten met weinig geheugen (zoals mobiele apparaten of ingebedde systemen), kan het flyweight-ontwerppatroon worden toegepast om de belasting op het geheugen te verminderen door Object
s te delen.
Implementatie van de stringpool in Java is een van de beste voorbeelden van implementatie van het flyweight-patroon.
Opmerking: Lees meer over het Flyweight Patroon.
5. Gevelpatroon
Het gevelpatroon wordt gebruikt om clienttoepassingen gemakkelijk te laten communiceren met het systeem.
Opmerking: Lees meer over het Gevelpatroon.
6. Brugpatroon
Wanneer we interfacehiërarchieën hebben in zowel interfaces als implementaties, wordt het brugontwerppatroon gebruikt om de interfaces te ontkoppelen van de implementatie en om de implementatiedetails te verbergen voor de clientprogramma’s. De implementatie van het brugontwerppatroon volgt het idee van de voorkeur voor samenstelling boven overerving.
Opmerking: Lees meer over het Brugpatroon.
7. Decorateurpatroon
Het decorator ontwerppatroon wordt gebruikt om de functionaliteit van een object op runtime te wijzigen. Tegelijkertijd zullen andere instanties van dezelfde klasse hierdoor niet worden beïnvloed, waardoor het individuele object het gewijzigde gedrag krijgt. Het decorator ontwerppatroon is een van de structurele ontwerppatronen (zoals het adapterpatroon, het brugpatroon of het samengestelde patroon) en maakt gebruik van abstracte klassen of interfaces met compositie om te implementeren. We gebruiken overerving of compositie om het gedrag van een object uit te breiden, maar dit gebeurt op compile-tijd en is van toepassing op alle instanties van de klasse. We kunnen geen nieuwe functionaliteit toevoegen of bestaand gedrag verwijderen op runtime – dit is wanneer het decoratorpatroon van pas komt.
Opmerking: Leer meer over het Decorator Patroon.
Gedragsontwerppatronen
Gedragspatronen bieden een oplossing voor betere interactie tussen objecten en hoe losse koppeling en flexibiliteit te bieden om gemakkelijk uit te breiden.
1. Template Method Patroon
Het template-method patroon is een gedragsontwerppatroon en wordt gebruikt om een methodestub te maken en om sommige stappen van de implementatie uit te stellen naar de subklassen. De template-methode definieert de stappen om een algoritme uit te voeren, en het kan een standaardimplementatie bieden die gemeenschappelijk kan zijn voor alle of enkele van de subklassen.
Opmerking: Lees meer over het Template Method-patroon.
2. Bemiddelingspatroon
Het bemiddelingsontwerppatroon wordt gebruikt om een gecentraliseerd communicatiemiddel te bieden tussen verschillende objecten in een systeem. Als de objecten rechtstreeks met elkaar communiceren, zijn de systeemcomponenten sterk met elkaar verbonden, wat de onderhoudskosten hoger maakt en niet flexibel om gemakkelijk uit te breiden. Het bemiddelingspatroon richt zich op het bieden van een bemiddelaar tussen objecten voor communicatie en het implementeren van losse koppeling tussen objecten. De bemiddelaar fungeert als een router tussen objecten, en het kan zijn eigen logica hebben om een communicatieweg te bieden.
Opmerking: Lees meer over het Bemiddelingspatroon
3. Ketenaanroep Patroon
Het ketenaanroep patroon wordt gebruikt om losse koppeling te bereiken in softwareontwerp waarbij een verzoek van de client wordt doorgegeven aan een keten van objecten om ze te verwerken. Vervolgens zal het object in de keten beslissen wie het verzoek zal verwerken en of het verzoek al dan niet naar het volgende object in de keten moet worden gestuurd.
We weten dat we meerdere catch
-blokken kunnen hebben in een try-catch
-blokcode. Hier is elk catch
-blok soort van een processor om die specifieke uitzondering te verwerken. Dus wanneer er een uitzondering optreedt in het try
-blok, wordt deze naar het eerste catch
-blok gestuurd om te verwerken. Als het catch
-blok het niet kan verwerken, stuurt het het verzoek door naar het volgende Object
in de keten (d.w.z. het volgende catch
-blok). Als zelfs het laatste catch
-blok het niet kan verwerken, wordt de uitzondering buiten de keten naar het aanroepende programma gegooid.
Opmerking: Lees meer over het Ketenaanroep Patroon.
4. Observer Patroon
Een observer ontwerppatroon is handig wanneer je geïnteresseerd bent in de staat van een Object
en op de hoogte wilt worden gesteld wanneer er een verandering optreedt. In het observer-patroon wordt het Object
dat de staat van een ander Object
bekijkt, observer genoemd, en het Object
dat wordt bekeken, wordt subject genoemd.
Java biedt een ingebouwd platform voor het implementeren van het observer-patroon via de java.util.Observable
-klasse en de java.util.Observer
-interface. Het wordt echter niet veel gebruikt omdat de implementatie beperkt is, en meestal willen we niet eindigen met het uitbreiden van een klasse alleen voor het implementeren van het observer-patroon, aangezien Java geen meervoudige overerving in klassen biedt. Java Message Service (JMS) gebruikt het observer-patroon samen met het mediator-patroon om applicaties in staat te stellen zich te abonneren op en gegevens te publiceren naar andere applicaties.
Opmerking: Lees meer over het Observer-patroon.
5. Strategiepatroon
Het strategiepatroon wordt gebruikt wanneer we meerdere algoritmen hebben voor een specifieke taak, en de klant beslist welke concrete implementatie wordt gebruikt tijdens runtime. Een strategiepatroon staat ook bekend als een beleidspatroon. We definiëren meerdere algoritmen en laten klanttoepassingen het te gebruiken algoritme doorgeven als een parameter.
Een van de beste voorbeelden van dit patroon is de methode Collections.sort()
die de Comparator-parameter gebruikt. Op basis van de verschillende implementaties van comparatorinterfaces worden de objecten op verschillende manieren gesorteerd.
Opmerking: Leer meer over het Strategiepatroon.
6. Commando Patroon
Het commandopatroon wordt gebruikt om losse koppeling te implementeren in een aanvraag-antwoordmodel. In dit patroon wordt de aanvraag naar de aanroeper gestuurd en de aanroeper geeft deze door aan het ingekapselde commando-object. Het commando-object geeft de aanvraag door aan de juiste methode van de ontvanger om de specifieke actie uit te voeren.
Opmerking: Leer meer over het Commando Patroon.
7. Toestand Patroon
De toestandsontwerppatroon wordt gebruikt wanneer een Object
zijn gedrag verandert op basis van zijn interne toestand. Als we het gedrag van een Object
moeten veranderen op basis van zijn toestand, kunnen we een toestandsvariabele in het Object
hebben en een if-else
-voorwaarde gebruiken om verschillende acties uit te voeren op basis van de toestand. Het toestandspatroon wordt gebruikt om op een systematische en losjes gekoppelde manier dit te bereiken via de context en toestandsimplementaties.
Opmerking: Lees meer over het Toestandspatroon.
8. Bezoekerspatroon
Het bezoekerspatroon wordt gebruikt wanneer we een bewerking moeten uitvoeren op een groep vergelijkbare objecten. Met behulp van een bezoekerspatroon kunnen we de operationele logica verplaatsen van de objecten naar een andere klasse.
Opmerking: Lees meer over het Bezoekerspatroon.
9. Interpreterpatroon
Het interpreterpatroon wordt gebruikt om een grammaticale representatie van een taal te definiëren en biedt een interpreter om met deze grammatica om te gaan.
10. Iterator Patroon
Het iteratorpatroon is een van de gedragspatronen en wordt gebruikt om een standaard manier te bieden om door een groep objecten te traverseren. Het iteratorpatroon wordt veel gebruikt in de Java-collectiekader waar de iteratorinterface methoden biedt voor het traverseren door een Collectie
. Dit patroon wordt ook gebruikt om verschillende soorten iterators te bieden op basis van onze vereisten. Het iteratorpatroon verbergt de daadwerkelijke implementatie van traverseren door de Collectie
en cliëntprogramma’s gebruiken iteratormethoden.
Opmerking: Lees meer over het Iteratorpatroon hier.
11. Memento Patroon
Het mementopatroon wordt gebruikt wanneer we de staat van een object willen opslaan zodat we het later kunnen herstellen. Dit patroon wordt gebruikt om dit op zo’n manier te implementeren dat de opgeslagen staatgegevens van het object niet toegankelijk zijn buiten het Object
, dit beschermt de integriteit van de opgeslagen staatgegevens.
Het Memento-patroon wordt geïmplementeerd met twee Object
s – originator en caretaker. De oorspronkelijke maker is het Object
waarvan de status moet worden opgeslagen en hersteld, en het gebruikt een binnenklasse om de status van Object
op te slaan. De binnenklasse heet “Memento”, en het is private
zodat het niet kan worden benaderd vanuit andere objecten.
Diverse Ontwerppatronen
Er zijn veel ontwerppatronen die niet onder de Gang of Four-ontwerppatronen vallen. Laten we eens kijken naar enkele van deze populaire ontwerppatronen.
1. DAO Ontwerppatroon
Het Data Access Object (DAO) ontwerppatroon wordt gebruikt om de logica voor gegevenspersistentie te ontkoppelen naar een aparte laag. DAO is een zeer populair patroon wanneer we systemen ontwerpen om met databases te werken. Het idee is om de servicelaag gescheiden te houden van de toegangslaag tot gegevens. Op deze manier implementeren we de scheiding van logica in onze toepassing.
Opmerking: Lees meer over het DAO Patroon.
2. Dependency Injection Patroon
Het dependency injection-patroon stelt ons in staat om de hard-gecodeerde afhankelijkheden te verwijderen en onze toepassing losjes gekoppeld, uitbreidbaar en onderhoudbaar te maken. We kunnen dependency injection implementeren in Java om de afhankelijkheidsresolutie van compiletijd naar runtime te verplaatsen. Het Spring-framework is gebouwd op het principe van dependency injection.
Opmerking: Lees meer over het Dependency Injection Patroon.
3. MVC Patroon
Het Model-View-Controller (MVC) Patroon is een van de oudste architecturale patronen voor het maken van webapplicaties.
Conclusie
Dit artikel heeft Java-ontwerppatronen samengevat.
U kunt voorbeeldcode van Java-ontwerppatronen bekijken in ons GitHub Repository.
Ga verder met je leerproces met meer Java tutorials.
Source:
https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial