Flyweight minta Java-ban

1. Áttekintés

Ebben a cikkben megnézzük a légsúlyos tervezési mintát. Ezt a mintát használják a memóriaterület csökkentésére. Javíthatja azok teljesítményét azokban az alkalmazásokban is, ahol az objektumok példányosítása költséges.

Egyszerűen fogalmazva, a légysúly mintázat egy gyárra épül, amely a létrehozott tárgyakat újrahasznosítja azáltal, hogy azokat létrehozás után tárolja. Minden alkalommal, amikor egy objektumot kérnek, a gyár megkeresi az objektumot, hogy ellenőrizze, létrejött-e már. Ha van, akkor a meglévő objektum visszakerül - ellenkező esetben újat hoz létre, tárol, majd visszaküld.

A légsúlyos objektum állapota egy invariáns komponensből áll, amelyet megosztanak más hasonló objektumokkal (belső) és egy változatkomponens, amelyet az ügyfélkód kezelhet (külső).

Nagyon fontos, hogy a légsúlyú tárgyak megváltoztathatatlanok legyenek: az állapoton végzett bármilyen műveletet a gyárnak kell elvégeznie.

2. Végrehajtás

A minta fő elemei:

  • egy felület, amely meghatározza azokat a műveleteket, amelyeket az ügyfélkód végezhet a légsúlyú objektumon
  • interfészünk egy vagy több konkrét megvalósítása
  • gyár az objektumok példányosításának és gyorsítótárának kezelésére

Nézzük meg, hogyan kell megvalósítani az egyes komponenseket.

2.1. Jármű interfész

Először létrehozunk egy Jármű felület. Mivel ez az interfész a gyári módszer visszatérési típusa lesz, feltétlenül feltesszük az összes releváns módszert:

public void start (); public void stop (); public Color getColor ();

2.2. Betonjármű

Ezután készítsünk egy Autó osztály, mint beton Jármű. Autónk a jármű interfészének minden módszerét megvalósítja. Az állapotát illetően motorja és színmezője lesz:

saját Motor motor; privát szín;

2.3. Járműgyár

Végül, de nem utolsósorban létrehozzuk a VehicleFactory. Új jármű építése nagyon költséges művelet, így a gyár színenként csak egy járművet hoz létre.

Ennek érdekében nyomon követjük a létrehozott járműveket a térkép, egyszerű gyorsítótár használatával:

privát statikus Map vehiclesCache = új HashMap (); public static Vehicle createVehicle (színes szín) {Vehicle newVehicle = vehiclesCache.computeIfAbsent (color, newColor -> {Engine newEngine = new Engine (); return new Car (newEngine, newColor);}); return newVehicle; }

Figyelje meg, hogy az ügyfélkód hogyan befolyásolhatja csak az objektum külső állapotát (járművünk színe), amely argumentumként adja át a createVehicle módszer.

3. Használjon tokokat

3.1. Adattömörítés

A légsúlyos minta célja a memóriahasználat csökkentése a lehető legtöbb adat megosztásával, ezért jó alap a veszteségmentes tömörítési algoritmusokhoz. Ebben az esetben minden légsúlyos objektum mutatóként működik, külső állapota a kontextustól függő információ.

A használat klasszikus példája a szövegszerkesztő. Itt minden karakter egy légsúlyos objektum, amely megosztja a megjelenítéshez szükséges adatokat. Ennek eredményeként csak a karakter helye a dokumentumban foglal el további memóriát.

3.2. Adattárolás

Számos modern alkalmazás gyorsítótárakat használ a válaszidő javítására. A légsúly mintázat hasonló a gyorsítótár alapkoncepciójához, és jól illeszkedik erre a célra.

Természetesen van néhány kulcsfontosságú különbség a bonyolultságban és a megvalósításban e minta és egy tipikus, általános célú gyorsítótár között.

4. Következtetés

Összefoglalva, ez a gyors oktatóanyag a Java légysúlyos tervezési mintájára összpontosított. Megvizsgáltuk a leggyakoribb forgatókönyveket is, amelyek magukban foglalják a mintát.

A példákból származó összes kód elérhető a GitHub projekten.


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