Flyvevekt mønster i Java

1. Oversikt

I denne artikkelen tar vi en titt på flyvevekten. Dette mønsteret brukes til å redusere minnefotavtrykket. Det kan også forbedre ytelsen i applikasjoner der objektinstansiering er dyrt.

Enkelt sagt, flyvevektningsmønsteret er basert på en fabrikk som resirkulerer skapte gjenstander ved å lagre dem etter opprettelsen. Hver gang et objekt blir bedt om, ser fabrikken opp objektet for å sjekke om det allerede er opprettet. Hvis den har det, returneres det eksisterende objektet - ellers opprettes det, lagres og returneres en ny.

Flyvevektsobjektets tilstand består av en uforanderlig komponent som deles med andre lignende objekter (iboende) og en variantkomponent som kan manipuleres av klientkoden (ekstrinsic).

Det er veldig viktig at objektene med flyvevekt er uforanderlige: enhver operasjon på staten må utføres av fabrikken.

2. Implementering

Hovedelementene i mønsteret er:

  • et grensesnitt som definerer operasjonene som klientkoden kan utføre på objektet med flyvevekt
  • en eller flere konkrete implementeringer av grensesnittet vårt
  • en fabrikk for å håndtere objekter instantiering og caching

La oss se hvordan du implementerer hver komponent.

2.1. Kjøretøygrensesnitt

Til å begynne med oppretter vi en Kjøretøy grensesnitt. Siden dette grensesnittet vil være returtypen til fabrikkmetoden, må vi sørge for å avsløre alle relevante metoder:

offentlig ugyldig start (); offentlig ugyldig stopp (); offentlig Farge getColor ();

2.2. Betongbil

Neste gang, la oss lage en Bil klasse som betong Kjøretøy. Bilen vår vil implementere alle metodene i kjøretøygrensesnittet. Når det gjelder tilstanden, vil den ha en motor og et fargefelt:

privat motor motor; privat farge farge;

2.3. Kjøretøyfabrikk

Sist men ikke minst, vil vi lage VehicleFactory. Å bygge et nytt kjøretøy er en veldig kostbar operasjon, så fabrikken vil bare lage ett kjøretøy per farge.

For å gjøre det, holder vi rede på de opprettet kjøretøyene ved hjelp av et kart som en enkel cache:

privat statisk kart vehiclesCache = ny HashMap (); public static Vehicle createVehicle (Color color) {Vehicle newVehicle = vehiclesCache.computeIfAbsent (color, newColor -> {Engine newEngine = new Engine (); return new Car (newEngine, newColor);}); returner nytt kjøretøy; }

Legg merke til hvordan klientkoden bare kan påvirke objektets ekstreme tilstand (fargen på kjøretøyet vårt) og sende det som et argument til createVehicle metode.

3. Bruk saker

3.1. Datakomprimering

Målet med flyvevektningsmønsteret er å redusere minnebruk ved å dele så mye data som mulig, derfor er det et godt grunnlag for tapsfri komprimeringsalgoritmer. I dette tilfellet fungerer hvert objekt med flyvevekt som en peker med sin ytre tilstand som den kontekstavhengige informasjonen.

Et klassisk eksempel på denne bruken er i en tekstbehandler. Her er hvert tegn et objekt med flyvevekt som deler dataene som trengs for gjengivelsen. Som et resultat tar bare posisjonen til tegnet inne i dokumentet ekstra minne.

3.2. Datacaching

Mange moderne applikasjoner bruker hurtigbuffer for å forbedre responstiden. Flyvevektningsmønsteret ligner kjernekonseptet med en cache og kan passe godt til dette formålet.

Selvfølgelig er det noen få viktige forskjeller i kompleksitet og implementering mellom dette mønsteret og en typisk hurtigbuffer.

4. Konklusjon

For å oppsummere fokuserte denne raske opplæringen på flyvevekt designmønsteret i Java. Vi sjekket også ut noen av de vanligste scenariene som involverer mønsteret.

All koden fra eksemplene er tilgjengelig på GitHub-prosjektet.


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