Kreatív tervezési minta: 1. Singleton minta

Mi az a kreatív tervezési minta?

(2020. december 26.)

A kreatív tervezési minták egy osztály új objektumainak létrehozásával vagy klónozásával foglalkoznak. A klónozás akkor következik be, amikor már létezik hasonló típusú objektum, és egy új objektum példányosítása helyett a meglévőt klónozzuk.

Az objektumok létrehozásának különböző módjai nagyban befolyásolják a probléma megoldását. A különböző nyelvek ezért befolyásolják, hogy milyen mintákat lehet használni.

Singleton minta

A Singleton mintát akkor használjuk, ha csak egy osztályra van szükségünk. Például DB-kapcsolat létrehozása egy alkalmazásban, a nyomtató nyomtatási sora, naplók használata, mivel ezek sok erőforrást igényelnek. Mindegyik esetben, ha több példány van, akkor zavart és inkonzisztenciát okoz.

Ezt a mintát akkor használják, ha a példány megosztott és globálisan elérhető az alkalmazásban. Nagyon fontos példa arra, hogy a megosztott erőforrásokhoz való hozzáférés szálbiztonságos-e, nagyon fontos példa arra, hogy ez a fajta minta létfontosságú lehet. A Singleton minta célja, hogy globális hozzáférést biztosítson egy osztályhoz, amely egy példányra korlátozódik.

Nézzük meg, hogyan jön létre az objektum

public class DummyClass{ DummyClass(){}
}DummyClass dc = new DummyClass(); //every time when this line is called a new object of DummyClass is created

Most, amikor egy DummyClass objektumra van szükség, meghívják a konstruktort, és létrehoznak egy objektumot. Ezt hívjuk Eger inicializálásnak.

De szingulett mintában csak egy osztályra van szükség. Tegyük fel, hogy ha a DB kapcsolat már be van állítva, akkor nem kell új DB kapcsolatot létrehoznunk, és a már meglévő kapcsolatot kell használnunk. Nézzük meg, hogyan lehet elérni.

Itt a konstruktor hatókörét magára az osztályra korlátoztuk. Tehát az osztály objektumának létrehozásához meg kell hívni az osztály getDBConnection () statikus metódusát. Ezután ellenőrzi, hogy a dbConnection objektum null-e, majd létrehoz egy új kapcsolati objektumot, és különben visszaadja a meglévő kapcsolatobjektumot.

Ez a példa bemutatja a lusta inicializálás . Ez azt jelenti, hogy csak akkor hozzuk létre az osztály objektumát, ha valóban szükség van rá. Ennélfogva ez a program erőforrások szempontjából hatékonyabb.

A Singleton design elvének kompromisszumai vannak. Ha több számítógépes szál fut, akkor problémákat okozhat, ha a szálak megpróbálják elérni a megosztott egyetlen objektumot.

A fenti megvalósítás problémái

Most lehetséges, hogy kettő szálak egyidejűleg meghívják a getDBConnection metódust, és az objektum még nincs létrehozva. Mindkét szál esetében a dbConnection objektum null lesz, és mindketten megpróbálnak létrehozni egy új példányt, és ezt használni. Ezért nagyon fontos megbizonyosodni arról, hogy egyszerre egyetlen szál férhet hozzá a getDBConnection-hez, így több példány nem jön létre.

szál elérése A -safe singleton osztály a globális hozzáférési módszer szinkronizálását teszi lehetővé, hogy egyszerre csak egy szál hajthassa végre ezt a módszert.

Ehhez a szinkronizált kódblokkhoz egyszerre csak egy szál férhet hozzá

Lehet, hogy arra gondolsz, hogy a probléma már megoldódott. De sajnos nem! A szingleton tulajdonság kikényszerítéséhez zárat tettünk a statikus getDBConnection metódusra, de egyúttal veszélyeztettük annak teljesítményét. Amikor egy objektum már létre van hozva, akkor több szálnak is várnia kell az objektum meglévő példányának megszerzésére. Csinálhatnánk valami jobbat? Lássuk.

Mivel nyilvánvaló, a zárolás csak akkor szükséges, ha a példány null, így a különböző szálak nem hoznak létre több példányt. Tehát szinkronizált feltételt tehetünk az if feltételbe, ahol ellenőrizzük, hogy a példány nulla-e, és adjunk hozzá kettős ellenőrzést a több példány forgatókönyveinek kiküszöbölésére.

Valódi használatban a szingulettminta különböző módon valósítható meg. Csak meghatározza ennek a mintának az alapvető célját, de a kód megvalósítása eltérhet.

Ez az én oldalamról szól. Remélem, most már világos, hogy hol, mikor és hogyan kell használni a szingulett mintát. A megértés érdekében utalhat a Gang of Four tervrajz-katalógusára.

Ha kétségei merülnének fel, kérjük, jelezze az alábbi megjegyzésekben. Ha tetszik ez a blog, kérjük, ossza meg barátaival. Boldog szoftverfejlesztést!

2. rész: