Bevezetés
A szoftvertervezésben a Tervezési minta ismert megoldást ír le a szoftverek leggyakrabban előforduló problémáira tervezés. A tapasztalt szoftverfejlesztők által próbákon és tévedéseken keresztül hosszú időn keresztül kialakult legjobb gyakorlatokat képviseli.
A tervezési minták népszerűségre tettek szert, miután a Design Patterns: Elusable Use Object-Oriented Software 1994-ben megjelentette az Erich Gamma könyvet. , John Vlissides, Ralph Johnson és Richard Helm (más néven Négyes bandája vagy GoF).
Ebben a cikkben “megvizsgáljuk a kreatív tervezési mintákat és azok típusait. Megnézünk néhányat is. kódmintákat és megvitatja azokat a helyzeteket, amikor ezek a minták illeszkednek a tervünkhöz.
Kreatív tervezési minták
A kreatív tervezési minták az objektumok létrehozásának módjával foglalkoznak. . Csökkentik a bonyolultságot és az instabilitást azáltal, hogy objektumokat irányított módon hoznak létre.
Az új operátort gyakran károsnak tekintik, mivel az objektumokat szétszórja az alkalmazásban. Idővel kihívássá válhat a megvalósítás módosítása, mert az osztályok szorosan összekapcsolódnak.
A kreatív tervezési minták ezt a problémát úgy kezelik, hogy teljesen leválasztják az ügyfelet a tényleges inicializálási folyamatról.
Ebben a cikkben , a kreatív tervezési minták négy típusát fogjuk megvitatni:
- Singleton – Biztosítja, hogy az alkalmazás során az objektumnak csak egyetlen példánya létezzen.
- Gyári módszer – több kapcsolódó osztály a létrehozandó objektum pontos megadása nélkül
- Abstract Factory – Családok létrehozása kapcsolódó függő objektumokból
- Builder – összetett objektumok felépítése lépésről lépésre
Lássuk most ezeket a mintákat részletesen.
Singleton tervezési minta
A Singleton tervezési minta célja megtartani egy adott osztály objektumainak inicializálásának ellenőrzése annak biztosításával, hogy az objektumnak csak egy példánya létezik a Java virtuális gépen.
A Singleton osztály egy egyedi globális hozzáférési pontot is biztosít az objektumnak, így minden egyes következő hozzáférési pontra irányuló hívás csak az adott objektumot adja vissza.
3.1. A Singleton minta példája
Bár a Singleton mintát a GoF vezette be, az eredeti megvalósítás problémás a többszálú forgatókönyvekben.
Tehát itt vagyunk egy optimálisabb megközelítést fogunk követni, amely egy statikus belső osztályt használ:
Itt létrehoztunk egy statikus belső osztályt, amely a Singleton osztály példáját tartalmazza. Csak akkor hozza létre a példányt, amikor valaki meghívja a getInstance () metódust, és nem akkor, ha a külső osztály betöltődik.
Ez egy széles körben alkalmazott megközelítés a Singleton osztály számára, mivel nem igényel szinkronizálást, szálkamentes , kikényszeríti a lusta inicializálást, és viszonylag kevesebb kazánja van.
Vegye figyelembe azt is, hogy a konstruktor rendelkezik saját hozzáférés-módosítóval. Ez a Singleton létrehozásának követelménye, mivel egy nyilvános konstruktor azt jelentené, hogy bárki hozzáférhet hozzá, és új példányokat hozhat létre.
Ne feledje, hogy ez nem az eredeti GoF implementáció. Az eredeti verzióért látogasson el erre az oldalra. linkelt Baeldung-cikk a Java Singletons-ről.
3.2. Mikor kell használni a Singleton Design Pattern-t?
- Olyan erőforrásokhoz, amelyeket drága létrehozni (például adatbázis) kapcsolatobjektumok)
- Jó gyakorlat minden naplót Singletonként tartani, ami növeli a teljesítményt
- Osztályok, amelyek hozzáférést biztosítanak az alkalmazás konfigurációs beállításaihoz
- Osztályok, amelyek erőforrásokat tartalmaz, amelyekhez megosztott módban férnek hozzá.
Gyári módszer tervezési mintája
A gyári tervezési minta vagy a gyári módszer tervezési mintája az egyik leggyakrabban használt tervezési minták a Java-ban.
A GoF szerint ez a minta “definiál egy felületet egy objektum létrehozásához, de hagyja, hogy az alosztályok döntsék el, melyik osztályt kell létrehozni tiate. A Factory módszer lehetővé teszi, hogy az osztály elhalaszthassa az alosztályok alaphelyzetbe állítását. ”
Ez a minta átruházza az osztály inicializálásának felelősségét az ügyféltől egy adott gyári osztályig egy virtuális konstruktor típusának létrehozásával.
Ennek eléréséhez egy olyan gyárra támaszkodunk, amely biztosítja az objektumokat, elrejtve a megvalósítás tényleges részleteit. A létrehozott objektumokat egy közös felületen lehet elérni.
4.1. Gyári módszer tervezési minta példa
Ebben a példában létrehozunk egy sokszög felületet, amelyet több konkrét osztály valósít meg. A PolygonFactory segítségével objektumokat lehet lekérni ebből a családból :
Először hozzuk létre a sokszög felületet:
Következő, létrehozunk néhány megvalósítást, például Négyzet, Háromszög stb., amelyek megvalósítják ezt az interfészt, és sokszög típusú objektumot adnak vissza.
Most létrehozhatunk egy gyárat, amely az oldalak számát veszi figyelembe argumentumként, és visszaadja ennek a felületnek a megfelelő megvalósítását:
Figyelje meg, hogy az ügyfél hogyan támaszkodhat erre a gyárra megfelelő sokszög, anélkül, hogy közvetlenül kellene inicializálni az objektumot.
4.2. Mikor kell használni a gyári módszer tervezési mintáját
- Amikor egy felület vagy egy absztrakt osztály megvalósítása várhatóan gyakran változik
- Amikor az aktuális megvalósítás nem tudja kényelmesen befogadni az új változásokat
- Amikor az inicializálás viszonylag egyszerű, és a kivitelezőnek csak néhány paraméterre van szüksége
Absztrakt gyártervezési minta
Az előző szakaszban azt láttuk, hogy a Factory Method tervezési mintával miként lehet egyetlen családhoz kapcsolódó objektumokat létrehozni.
Ezzel szemben az absztrakt gyári tervezési mintát használják rokon vagy függő tárgyak családjainak létrehozására. Néha gyárgyárnak is hívják.
Részletes magyarázatért olvassa el az Absztrakt gyár oktatóanyagunkat.
Készítő tervezési mintája
A Builder Design Pattern egy másik kreatív minta, amely viszonylag összetett objektumok felépítésével foglalkozik.
Amikor az objektum létrehozásának bonyolultsága növekszik, a Builder minta elkülönítheti a példányosítás folyamatát egy másik felhasználásával. objektum (egy készítő) az objektum elkészítéséhez.
Ez a készítő felhasználható sok más hasonló ábrázolás létrehozására egyszerű lépésről lépésre.
6.1. Készítő minta Példa
Az eredeti, a GoF által bevezetett Builder Design Pattern az absztrakcióra összpontosít, és nagyon jó komplex objektumok kezelésénél, azonban a tervezés kissé bonyolult.
Joshua Bloch Effective Java című könyvében bemutatta az építőminta továbbfejlesztett változatát, amely tiszta, jól olvasható (mert kifinomult tervezés) és az ügyfél szempontjából könnyen használható. Ebben a példában megvitatjuk az adott verziót.
Ennek a példának csak egy osztálya van, a BankAccount, amely statikus belső osztályként tartalmaz egy készítőt:
Ne feledje, hogy a mezők összes hozzáférés-módosítóját privátnak nyilvánítják, mivel nem akarjuk, hogy a külső objektumok közvetlenül hozzáférjenek hozzájuk.
A konstruktor szintén privát, így csak ehhez a Builder tartozik osztály elérheti. A konstruktorban beállított összes tulajdonság kivonásra kerül az építőobjektumból, amelyet argumentumként adunk meg.
Meghatároztuk a BankAccountBuildert egy statikus belső osztályban:
Megjegyzés: ugyanazt a mezőkészletet deklaráltuk, amelyet a külső osztály tartalmaz. Bármely kötelező mező kitöltése argumentumként szükséges a belső osztály konstruktorához, míg a többi opcionális mező megadható a setter metódusokkal.
Ez a megvalósítás támogatja a gördülékeny tervezési megközelítést azáltal, hogy a setter metódusokkal visszaadja az építőt objektum.
Végül a build metódus meghívja a külső osztály privát konstruktorát, és átadja magát argumentumként. A visszaküldött BankAccount példányt kap a BankAccountBuilder által beállított paraméterekkel.
Lássunk egy gyors példát az építő mintára működés közben:
6.2. Mikor kell használni a Builder Pattern
- Ha az objektum létrehozásával kapcsolatos folyamat rendkívül összetett, sok kötelező és opcionális paraméterrel rendelkezik
- Amikor egy A konstruktor paramétereinek számának növekedése a konstruktorok nagy listájához vezet
- Amikor a kliens különböző reprezentációkat vár a létrehozott objektumtól
Következtetés
Ebben a cikkben megismerkedtünk a Java kreatív tervezési mintáival, és megvitattuk a négy különböző típusukat is: Singleton, Factory Method, Abstract Factory és Builder Pattern, azok előnyeit, példáit és mikor használjuk őket.
Mint mindig, a teljes kódrészletek is elérhetők a GitHubon.
Kezdje el az 5. tavaszt és a Tavaszi indítást a Tanuljon tavasszal tanfolyam segítségével:
> > ELLENŐRIZZE A TANFOLYAMOT