Vlieggewichtpatroon in Java

1. Overzicht

In dit artikel zullen we het ontwerppatroon van vlieggewicht bekijken. Dit patroon wordt gebruikt om de geheugenvoetafdruk te verkleinen. Het kan ook de prestaties verbeteren in toepassingen waar object-instantiatie duur is.

Simpel gezegd, het vlieggewichtpatroon is gebaseerd op een fabriek die gemaakte objecten recyclet door ze op te slaan nadat ze zijn gemaakt. Elke keer dat een object wordt aangevraagd, zoekt de fabriek het object op om te controleren of het al is gemaakt. Als dit het geval is, wordt het bestaande object geretourneerd - anders wordt er een nieuw gemaakt, opgeslagen en vervolgens geretourneerd.

De toestand van het vlieggewichtobject bestaat uit een invariante component die wordt gedeeld met andere vergelijkbare objecten (intrinsiek) en een variantcomponent die kan worden gemanipuleerd door de klantcode (extrinsiek).

Het is erg belangrijk dat de vlieggewichtobjecten onveranderlijk zijn: elke bewerking aan de staat moet door de fabriek worden uitgevoerd.

2. Implementatie

De belangrijkste elementen van het patroon zijn:

  • een interface die de bewerkingen definieert die de clientcode kan uitvoeren op het flyweight-object
  • een of meer concrete implementaties van onze interface
  • een fabriek voor het instantiëren en cachen van objecten

Laten we eens kijken hoe we elk onderdeel kunnen implementeren.

2.1. Voertuiginterface

Om te beginnen maken we een Voertuig koppel. Aangezien deze interface het retourtype van de fabrieksmethode zal zijn, moeten we ervoor zorgen dat alle relevante methoden beschikbaar zijn:

public void start (); openbare leegte stop (); openbare kleur getColor ();

2.2. Betonnen voertuig

Laten we vervolgens een Auto klasse als een beton Voertuig. Onze auto zal alle methoden van de voertuiginterface implementeren. Wat betreft de staat, het heeft een motor en een kleurveld:

particuliere motorblok; privé kleur kleur;

2.3. Voertuigfabriek

Last but not least maken we de VehicleFactory. Het bouwen van een nieuw voertuig is een erg dure operatie, dus de fabriek zal maar één voertuig per kleur maken.

Om dat te doen, houden we de aangemaakte voertuigen bij met behulp van een kaart als een eenvoudige cache:

privé statische kaart vehiclesCache = nieuwe HashMap (); openbaar statisch Voertuig createVehicle (Kleur kleur) {Voertuig newVehicle = vehiclesCache.computeIfAbsent (kleur, newColor -> {Engine newEngine = new Engine (); retourneer nieuwe auto (newEngine, newColor);}); retourneer newVehicle; }

Merk op hoe de clientcode alleen de extrinsieke toestand van het object (de kleur van ons voertuig) kan beïnvloeden door het als argument door te geven aan de createVehicle methode.

3. Gebruik gevallen

3.1. Data compressie

Het doel van het vlieggewichtpatroon is om het geheugengebruik te verminderen door zoveel mogelijk gegevens te delen, daarom is het een goede basis voor verliesloze compressie-algoritmen. In dit geval fungeert elk vlieggewichtobject als een aanwijzer, waarbij de extrinsieke toestand de contextafhankelijke informatie is.

Een klassiek voorbeeld van dit gebruik is in een tekstverwerker. Hier is elk personage een vlieggewichtobject dat de gegevens deelt die nodig zijn voor de weergave. Als gevolg hiervan neemt alleen de positie van het teken in het document extra geheugen in beslag.

3.2. Gegevenscaching

Veel moderne applicaties gebruiken caches om de responstijd te verbeteren. Het vlieggewichtpatroon is vergelijkbaar met het kernconcept van een cache en past hier goed bij.

Er zijn natuurlijk een paar belangrijke verschillen in complexiteit en implementatie tussen dit patroon en een typische cache voor algemene doeleinden.

4. Conclusie

Kortom, deze korte tutorial was gericht op het vlieggewichtontwerppatroon in Java. We hebben ook enkele van de meest voorkomende scenario's met het patroon bekeken.

Alle code uit de voorbeelden is beschikbaar in het GitHub-project.