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.