Introductie tot Creational Design Patterns

Introductie

In software engineering beschrijft een Design Pattern een gevestigde oplossing voor de meest voorkomende problemen in software ontwerp. Het vertegenwoordigt de best practices die gedurende een lange periode met vallen en opstaan zijn geëvolueerd door ervaren softwareontwikkelaars.

Design Patterns is populair geworden nadat het boek Design Patterns: Elements of Reusable Object-Oriented Software in 1994 werd gepubliceerd door Erich Gamma , John Vlissides, Ralph Johnson en Richard Helm (ook bekend als Gang of Four of GoF).

In dit artikel zullen we “creatieve ontwerppatronen en hun typen onderzoeken. We zullen ook kijken naar enkele codevoorbeelden en bespreek de situaties waarin deze patronen passen in ons ontwerp.

Creational Design Patterns

Creational Design Patterns houdt zich bezig met de manier waarop objecten worden gemaakt . Ze verminderen de complexiteit en instabiliteit door objecten op een gecontroleerde manier te creëren.

De nieuwe operator wordt vaak als schadelijk beschouwd omdat hij objecten door de hele applicatie verstrooit. Na verloop van tijd kan het een uitdaging worden om een implementatie te wijzigen omdat klassen nauw met elkaar worden gekoppeld.

Creational Design Patterns lost dit probleem op door de client volledig los te koppelen van het daadwerkelijke initialisatieproces.

In dit artikel bespreken we vier soorten Creational Design Pattern:

  1. Singleton – Zorgt ervoor dat er in de hele applicatie maximaal één instantie van een object bestaat
  2. Fabrieksmethode – Maakt objecten van verschillende gerelateerde klassen zonder het exacte object te specificeren dat moet worden gemaakt
  3. Abstract Factory – maakt families van gerelateerde afhankelijke objecten
  4. Builder – construeert complexe objecten met een stapsgewijze benadering

Laten we nu elk van deze patronen in detail bespreken.

Singleton Design Pattern

Het Singleton Design Pattern is bedoeld om een controle op initialisatie van objecten van een bepaalde klasse door ervoor te zorgen dat er slechts één instantie van het object bestaat in de Java Virtual Machine.

Een Singleton-klasse biedt ook één uniek globaal toegangspunt tot het object, zodat elke volgende aanroep naar het toegangspunt alleen dat specifieke object retourneert.

3.1. Singleton Pattern-voorbeeld

Hoewel het Singleton-patroon werd geïntroduceerd door GoF, is bekend dat de oorspronkelijke implementatie problematisch is in scenario’s met meerdere threads.

Dus hier, we ” We gaan een meer optimale benadering volgen die gebruik maakt van een statische innerlijke klasse:

Hier hebben we een statische innerlijke klasse gemaakt die de instantie van de Singleton-klasse bevat. Het maakt de instantie alleen aan wanneer iemand de methode getInstance () aanroept en niet wanneer de buitenste klasse wordt geladen.

Dit is een veel gebruikte benadering voor een Singleton-klasse omdat deze geen synchronisatie vereist, thread-safe is , dwingt luie initialisatie af en heeft relatief minder standaardplaat.

Merk ook op dat de constructor de private access modifier heeft. Dit is een vereiste voor het maken van een Singleton, aangezien een openbare constructor zou betekenen dat iedereen er toegang toe heeft en nieuwe instanties kan maken.

Onthoud dat dit niet de originele GoF-implementatie is. Ga voor de originele versie naar deze gekoppeld Baeldung-artikel over Singletons in Java.

3.2. Wanneer Singleton Design Pattern gebruiken

  • Voor resources die duur zijn om te maken (zoals database verbindingsobjecten)
  • Het is een goede gewoonte om alle loggers als Singletons te houden, wat de prestaties verhoogt
  • Klassen die toegang bieden tot configuratie-instellingen voor de applicatie
  • Klassen die bronnen bevatten die toegankelijk zijn in de gedeelde modus.

Ontwerppatroon Fabrieksmethode

Het ontwerppatroon Fabriekspatroon of Fabrieksmethode is een van de meest gebruikte ontwerppatronen in Java.

Volgens GoF definieert dit patroon “een interface voor het maken van een object, maar laat subklassen beslissen welke klasse moet worden geïnstalleerd tiate. Met de Factory-methode kan een klasse instantiatie uitstellen naar subklassen. ”

Dit patroon delegeert de verantwoordelijkheid voor het initialiseren van een klasse van de client naar een bepaalde fabrieksklasse door een type virtuele constructor te maken.

Om dit te bereiken, vertrouwen we op een fabriek die ons de objecten levert en de feitelijke uitvoeringsdetails verbergt. De gemaakte objecten zijn toegankelijk via een gemeenschappelijke interface.

4.1. Fabrieksmethode Ontwerppatroonvoorbeeld

In dit voorbeeld zullen we een Polygon-interface maken die zal worden geïmplementeerd door verschillende concrete klassen. Een PolygonFactory zal worden gebruikt om objecten uit deze familie op te halen :

Laten we eerst de Polygon-interface maken:

Vervolgens we zullen een paar implementaties maken zoals Square, Triangle, enz. die deze interface implementeren en een object van het type Polygon teruggeven.

Nu kunnen we een fabriek creëren die het aantal kanten als argument neemt en de juiste implementatie van deze interface retourneert:

Merk op hoe de klant erop kan vertrouwen dat deze fabriek ons een geschikte Polygoon, zonder het object direct te hoeven initialiseren.

4.2. Wanneer het ontwerppatroon van de fabrieksmethode moet worden gebruikt

  • Wanneer wordt verwacht dat de implementatie van een interface of een abstracte klasse regelmatig zal veranderen
  • Wanneer de huidige implementatie kan nieuwe veranderingen niet gemakkelijk accommoderen
  • Wanneer het initialisatieproces relatief eenvoudig is en de constructor slechts een handvol parameters nodig heeft

Abstract Factory Design Pattern

In de vorige sectie hebben we gezien hoe het ontwerppatroon van de fabrieksmethode kan worden gebruikt om objecten te maken die gerelateerd zijn aan een enkele familie.

Daarentegen wordt het abstracte fabrieksontwerppatroon gebruikt om families van verwante of afhankelijke objecten te creëren. Het wordt ook wel eens een fabriek van fabrieken genoemd.

Voor een gedetailleerde uitleg, bekijk onze Abstract Factory tutorial.

Builder Design Pattern

Het Builder-ontwerppatroon is een ander ontwerppatroon dat is ontworpen om de constructie van relatief complexe objecten te verwerken.

Wanneer de complexiteit van het maken van objecten toeneemt, kan het Builder-patroon het instantiatieproces scheiden door een ander object (een bouwer) om het object te construeren.

Deze builder kan vervolgens worden gebruikt om vele andere soortgelijke representaties te maken met behulp van een eenvoudige stapsgewijze aanpak.

6.1. Builderpatroon Voorbeeld

Het originele Builder-ontwerppatroon dat door GoF is geïntroduceerd, richt zich op abstractie en is erg goed bij het omgaan met complexe objecten, maar het ontwerp is een beetje ingewikkeld.

Joshua Bloch introduceerde in zijn boek Effective Java een verbeterde versie van het builder-patroon dat schoon en goed leesbaar is (omdat het gebruik maakt van vloeiend ontwerp) en gemakkelijk te gebruiken vanuit het perspectief van de klant. In dit voorbeeld zullen we “die versie bespreken.

Dit voorbeeld heeft slechts één klasse, BankAccount die een builder bevat als een statische innerlijke klasse:

Merk op dat alle toegangsmodificatoren op de velden privé worden verklaard, aangezien we niet willen dat externe objecten er rechtstreeks toegang toe hebben.

De constructor is ook privé, zodat alleen de bouwer die hieraan is toegewezen klasse heeft er toegang toe. Alle eigenschappen die in de constructor zijn ingesteld, worden geëxtraheerd uit het builder-object dat we als argument aanleveren.

We hebben BankAccountBuilder gedefinieerd in een statische innerlijke klasse:

Merk op dat we dezelfde set velden hebben gedeclareerd als de buitenste klasse. Alle verplichte velden zijn vereist als argumenten voor de constructor van de innerlijke klasse, terwijl de resterende optionele velden kunnen worden gespecificeerd met behulp van de setter-methoden.

Deze implementatie ondersteunt ook de vloeiende ontwerpbenadering door de setter-methoden de bouwer te laten retourneren object.

Ten slotte roept de build-methode de private constructor van de buitenste klasse aan en geeft zichzelf door als het argument. De geretourneerde BankAccount wordt geïnstantieerd met de parameters die zijn ingesteld door de BankAccountBuilder.

Laten we eens kijken naar een snel voorbeeld van het bouwerpatroon in actie:

6.2. Wanneer Builder Pattern gebruiken

  1. Wanneer het proces dat betrokken is bij het maken van een object extreem complex is, met veel verplichte en optionele parameters
  2. Wanneer een toename van het aantal constructorparameters leidt tot een grote lijst met constructors
  3. Wanneer de klant verschillende representaties verwacht voor het object dat is geconstrueerd

Conclusie

In dit artikel leerden we over creatieve ontwerppatronen in Java. We bespraken ook hun vier verschillende typen, namelijk Singleton, Factory Method, Abstract Factory en Builder Pattern, hun voordelen, voorbeelden en wanneer we gebruiken ze.

Zoals altijd zijn de volledige codefragmenten beschikbaar op GitHub.

Ga aan de slag met Spring 5 en Spring Boot 2 via de Learn Spring-cursus:

> > BEKIJK DE CURSUS

Leave a Reply

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *