CodeGym /Java blog /Véletlen /Minták és Singleton Java nyelven
John Squirrels
Szint
San Francisco

Minták és Singleton Java nyelven

Megjelent a csoportban
Ez a cikk mindenkinek szól, aki először találkozik a tervezési minták fogalmával, hallotta a singleton kifejezést , vagy valamilyen módon megvalósította a singleton mintát, de nem értette, mi történik. Üdvözöljük! A CodeGym tanulói először a 15. szinten találkoznak tervezési mintákkal, amikor a kapitány váratlanul arra kéri őket, hogy „erősítsék meg” megértésüket a Java Singleton minta lusta implementációval történő megvalósításával. Azokban a diákokban , akik először hallanak a singleton mintáról, azonnal sok kérdés merül fel: mi a fenét az a tervezési minta? Miért van rá szükségünk? Mi az a szingli ? És végül, mi a lusta megvalósítás? Válaszoljunk sorban ezekre a kérdésekre.

Mi a fenét a tervezési minta?

Azt hiszem, egy kis történelem azért van, hogy erre a kérdésre a legjobb megértéssel válaszoljunk. Négy híres programozószerző (Erich Gamma, John Vlissides, Ralph Johnson és Richard Helm) érdekes ötlettel állt elő. Észrevették, hogy a szoftverfejlesztés gyakran megköveteli tőlük, hogy megközelítőleg ugyanazokat a problémákat oldják meg, és ugyanolyan szerkezetű kódot írjanak. Ezért úgy döntöttek, hogy leírják a tipikus mintákat, amelyeket gyakran kell használni az objektum-orientált programozásban. Könyvük 1994-ben jelent meg Design Patterns: Elements of Reusable Object-Oriented Software címmel. A könyv neve túl hosszúnak bizonyult, és az emberek egyszerűen a Négyek Bandája könyvének kezdték hívni. Az első kiadás 23 mintát tartalmazott. Ezt követően több tucat más mintát fedeztek fel.
A tervezési minta egy általános probléma szabványosított megoldása.
És a singleton minta csak egy ezek közül.

Miért van szükségünk tervezési mintákra?

Programozhat anélkül, hogy ismerné a mintákat: elvégre a 15. szintig már több száz miniprogramot írt a CodeGym-en anélkül, hogy tudná, hogy léteznek. Ez arra utal, hogy a tervezési minták egyfajta eszköz, amelynek használata megkülönbözteti a mestert az amatőrtől: A tervezési minták leírják, hogyan kell megfelelően megoldani egy tipikus problémát. Ez azt jelenti, hogy a minták ismerete időt takarít meg. Ilyen módon hasonlítanak az algoritmusokhoz. Például létrehozhat saját rendezési algoritmust blackjack-kel és számokkalés sok időt töltesz ezzel, vagy megvalósíthatsz olyat, ami már régóta értett és leírt. Ugyanez a helyzet a tervezési mintákkal. Ezenkívül a tervezési mintákkal a kód szabványosabbá válik, és a megfelelő minta használatakor kevésbé valószínű, hogy hibázunk, mivel a minta gyakori buktatóit már régen azonosították és kiküszöbölték. Minden más mellett a minták ismerete segít a programozóknak jobban megérteni egymást. Egyszerűen kimondhatja a minta nevét, ahelyett, hogy hosszas magyarázatot adna programozótársainak. Összefoglalva, a tervezési minták segítenek:
  • ne találja fel újra a kereket, hanem használjon szabványos megoldásokat;
  • kód szabványosítása;
  • szabványosítani a terminológiát;
A szakasz befejezéseként megjegyezzük, hogy a tervezési minták egésze három nagy csoportra osztható: Minták és szingli – mindenkinek, aki először találkozik velük – 2

Végül a singleton minta

A Singleton egy teremtő minta . Ez a minta biztosítja, hogy egy osztálynak csak egy példánya legyen, és globális hozzáférési pontot biztosít ehhez az objektumhoz. A leírásból egyértelműnek kell lennie, hogy ezt a mintát két esetben kell alkalmazni:
  1. amikor a program megköveteli, hogy egy adott osztályból legfeljebb egy objektum jöjjön létre. Például egy számítógépes játék tartalmazhat egy Hero osztályt és csak egy Hero objektumot, amely leírja a játék egyetlen hősét.

  2. amikor meg kell adnia egy pontot az objektum globális eléréséhez. Más szóval, az objektumot a program bármely pontjáról elérhetővé kell tennie. Sajnos nem elég egyszerűen létrehozni egy globális változót, mivel az nem írásvédett: bárki megváltoztathatja a változó értékét, így az objektum globális hozzáférési pontja elveszhet. A Singleton ezen tulajdonságaira például akkor van szükség, ha van egy objektum, amely egy adatbázissal működik, és a program különböző részeiből kell elérnie az adatbázist. A Singleton biztosítja, hogy senki ne írjon olyan kódot, amely helyettesíti a korábban létrehozott példányt.
Tehát egy Singleton ezt a két igényt kielégítette: egy bizonyos típusú objektumból csak egynek kell lennie a programban, és globális hozzáférésnek kell lennie hozzá. A 15. szintű példában a kapitány kéri, hogy hajtsa végre ezt a mintát a következő feladathoz:
  1. Keressen egy példát a Singletonra lusta inicializálással.

  2. Hozzon létre három egyszemélyes osztályt – Nap, Hold, Föld – külön fájlokban ugyanazon az elven.

  3. MegvalósítaniBolygóinterfész a Nap , Hold és Föld osztályokban.

  4. A Solution osztály statikus blokkjában hívja areadKeyFromConsoleAndInitPlanetmódszer.

  5. Végezze el areadKeyFromConsoleAndInitPlaneta módszer funkcionalitása:

    • 5.1. Olvasson be egy String paramétert a konzolról

    • 5.2. Ha a paraméter megegyezik az egyikkelBolygóinterfész állandóit, hozza létre a megfelelő thePlanet objektumot.

A feladat feltételeinek alapos elolvasása után világosan látjuk, hogy miért van itt szükség Singletonra . Valójában a következő osztályok mindegyikéből hozzunk létre egy példányt: Nap , Hold , Föld . Célszerű azt feltételezni, hogy legfeljebb egy Napot/Holdot/Földet hozzunk létre. Ellenkező esetben abszurd helyzetbe kerülünk, hacsak nem a Star Wars verzióját írod. A Singleton minta implementálása Java-ban három lépésben A Java-ban a Singleton viselkedés nem valósítható meg közönséges konstruktorral, mert a konstruktor mindig új objektumot ad vissza. Ezért a Singleton összes megvalósításaA konstruktor elrejtésében, egy nyilvános statikus metódus létrehozásában, amely szabályozza az egyetlen objektum élettartamát, és "megsemmisítve" minden újonnan megjelenő objektumot. Ha egy Singletonhoz férünk hozzá, akkor vagy új objektumot kell létrehoznia (ha még nem létezik a programban), vagy vissza kell adnia egy meglévőt. Ennek megvalósításához:
  1. Adnia kell az osztálynak egy privát statikus mezőt, amely egyetlen objektumot tárol:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance; // #1
    }
    
  2. Tegye priváttá az (alapértelmezett) konstruktort. Ez azt jelenti, hogy nem érhető el az osztályon kívül, és nem tud új objektumokat visszaadni:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance;
    private LazyInitializedSingleton(){} // #2
    } 
    
  3. Deklaráljon egy statikus létrehozási módszert, amelyet a szingli beszerzéséhez használunk majd:

    
    public class LazyInitializedSingleton {
        private static LazyInitializedSingleton instance;
            private LazyInitializedSingleton() {}
            public static LazyInitializedSingleton getInstance() { // #3
            if (instance == null) { // If the object has not yet been created
                instance = new LazyInitializedSingleton(); // Create a new object
            }
            return instance; // Return the previously created object
        }
    }
    
A fenti példa kissé ügyetlen, mivel egyszerűen elrejtjük a konstruktort, és megadjuk a saját metódusunkat a szokásos konstruktor helyett. Mivel ennek a cikknek az a célja, hogy a CodeGym tanulói kapcsolatba kerüljenek ezzel a mintával (és általában a tervezési mintákkal), a bonyolultabb egyszemélyes megvalósítások árnyalatait itt nem ismertetjük. Csak azt jegyezzük meg, hogy a program összetettségétől függően előfordulhat, hogy ezt a mintát tovább kell finomítani. Például egy többszálú környezetben (lásd a szálakról szóló cikkeket) egyszerre több különböző szál is hozzáférhet a singleton metódushoz, és a fent leírt kód leáll, mivel minden külön szál létrehozhatja az osztály egy példányát. Ennek eredményeként még mindig számos különböző megközelítés létezik a megfelelő szálbiztos szingapúrok létrehozására. De ez egy másik történet =)

És végül... Mi ez a lusta inicializálás, amiről a kapitány kérdezett?

A lusta inicializálást késleltetett inicializálásnak is nevezik. Ez egy olyan programozási trükk, ahol egy erőforrás-igényes műveletet (és egy objektum létrehozása erőforrásigényes művelet) igény szerint hajtanak végre, nem pedig előre. Tehát mi történik valójában a Singleton Java kódunkban? Más szóval, az objektumunk akkor jön létre, amikor elérjük, nem pedig előre. Nem szabad azt feltételezni, hogy a lusta inicializálás valahogy mereven kötődik a Singleton mintához. A lusta inicializálást más kreatív tervezési mintákban is használják, mint például a Proxy és a Factory Method, de ez is egy másik történet =)
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION