Flyvægtsmønster i Java

1. Oversigt

I denne artikel vil vi se på designmønsteret med flyvægt. Dette mønster bruges til at reducere hukommelsens fodaftryk. Det kan også forbedre ydeevnen i applikationer, hvor instantiering af objekter er dyr.

Kort sagt, flyvevægtsmønsteret er baseret på en fabrik, der genbruger oprettede genstande ved at gemme dem efter oprettelsen. Hver gang der anmodes om et objekt, ser fabrikken objektet op for at kontrollere, om det allerede er oprettet. Hvis det har gjort, returneres det eksisterende objekt - ellers oprettes en ny, gemmes og returneres derefter.

Flyvevægtsobjektets tilstand består af en invariant komponent, der deles med andre lignende objekter (iboende) og en variantkomponent, der kan manipuleres med klientkoden (ekstrinsic).

Det er meget vigtigt, at genstandene med flyvevægt er uforanderlige: enhver operation på staten skal udføres af fabrikken.

2. Implementering

Hovedelementerne i mønsteret er:

  • en grænseflade, der definerer de operationer, som klientkoden kan udføre på objektet med flyvægt
  • en eller flere konkrete implementeringer af vores interface
  • en fabrik til håndtering af genstande og caching af genstande

Lad os se, hvordan man implementerer hver komponent.

2.1. Køretøjsgrænseflade

Til at begynde med opretter vi en Køretøj interface. Da denne grænseflade er returneringstypen for fabriksmetoden, skal vi sørge for at eksponere alle de relevante metoder:

offentlig ugyldig start (); offentligt ugyldigt stop (); offentlig farve getColor ();

2.2. Beton køretøj

Lad os derefter lave en Bil klasse som beton Køretøj. Vores bil implementerer alle metoderne i køretøjsgrænsefladen. Med hensyn til dens tilstand vil den have en motor og et farvefelt:

privat motor motor; privat farve farve;

2.3. Køretøjsfabrik

Sidst men ikke mindst opretter vi VehicleFactory. At bygge et nyt køretøj er en meget dyr operation, så fabrikken opretter kun et køretøj pr. Farve.

For at gøre det holder vi styr på de oprettede køretøjer ved hjælp af et kort som en simpel cache:

privat statisk kort vehiclesCache = ny HashMap (); public static Vehicle createVehicle (Color color) {Vehicle newVehicle = vehiclesCache.computeIfAbsent (color, newColor -> {Engine newEngine = new Engine (); returner ny bil (newEngine, newColor);}); returner nyt køretøj; }

Læg mærke til, hvordan klientkoden kun kan påvirke objektets ydre tilstand (farven på vores køretøj) ved at sende det som et argument til createVehicle metode.

3. Brug sager

3.1. Datakomprimering

Målet med flyvevægtsmønsteret er at reducere hukommelsesforbruget ved at dele så mange data som muligt, derfor er det et godt grundlag for tabsfri komprimeringsalgoritmer. I dette tilfælde fungerer hvert flyvevægtsobjekt som en markør, hvor dets ydre tilstand er den kontekstafhængige information.

Et klassisk eksempel på denne brug er i en tekstbehandler. Her er hvert tegn et flyvevægtsobjekt, der deler de nødvendige data til gengivelsen. Som et resultat optager kun positionen for tegnet inde i dokumentet yderligere hukommelse.

3.2. Datacaching

Mange moderne applikationer bruger caches for at forbedre responstiden. Flyvevægtsmønsteret ligner kernekonceptet med en cache og kan passe godt til dette formål.

Der er naturligvis et par nøgleforskelle i kompleksitet og implementering mellem dette mønster og en typisk cache til generelle formål.

4. Konklusion

For at opsummere fokuserede denne hurtige vejledning på flyvægtens designmønster i Java. Vi tjekkede også nogle af de mest almindelige scenarier, der involverer mønsteret.

Al koden fra eksemplerne er tilgængelig på GitHub-projektet.


$config[zx-auto] not found$config[zx-overlay] not found