Prototípus minta Java-ban

1. Bemutatkozás

Ebben az oktatóanyagban megismerhetjük az egyik kreatív tervezési mintát - a prototípus mintát. Eleinte elmagyarázzuk ezt a mintát, majd folytatjuk a Java alkalmazásban.

Megbeszéljük néhány előnyét és hátrányát is.

2. Prototípus minta

A prototípus mintája általában akkor használjuk, ha van egy osztályunk (prototípusunk), és új objektumokat szeretnénk létrehozni a prototípus átmásolásával.

Használjunk hasonlatot e minta jobb megértéséhez.

Egyes játékokban fákat vagy épületeket szeretnénk a háttérben. Rájöhetünk, hogy nem kell új fákat vagy épületeket létrehoznunk, és azokat minden alkalommal a képernyőn megjelenítenünk, amikor a karakter mozog.

Tehát először létrehozunk egy példányt a fáról. Ezután annyi fát hozhatunk létre, amennyit csak akarunk ettől a példánytól (prototípus), és frissíthetjük a pozícióikat. Dönthetünk úgy is, hogy megváltoztatjuk a fák színét egy új szintre a játékban.

A Prototype minta meglehetősen hasonló. Új objektumok létrehozása helyett csak klónozni kell a prototípusos példányt.

3. UML diagram

A diagramon azt látjuk, hogy az ügyfél azt mondja a prototípusnak, hogy klónozza magát és hozzon létre egy objektumot. Prototípus egy interfész, és deklarálja a klónozás módszerét. 1. Beton prototípus és ConcretePrototype2 saját maguk klónozására hajtsák végre a műveletet.

4. Végrehajtás

Ennek a mintának a Java-ban történő megvalósításának egyik módja a klón () módszer. Ehhez megvalósítanánk a Klónozható felület.

Amikor klónozni próbálunk, el kell döntenünk egy sekély vagy egy mély másolat készítése között. Végül megfelel a követelményeknek.

Például, ha az osztály csak primitív és változhatatlan mezőket tartalmaz, használhatunk sekély másolatot.

Ha mutábilis mezőkre hivatkozásokat tartalmaz, akkor mély másolatot kell találnunk. Megtehetjük, hogy másolat készítők vagy sorosítás és deserializáció.

Vegyük a korábban említett példát, és folytassuk a prototípus mintának a Klónozható felület. Ennek érdekében hozzunk létre egy absztrakt osztály hívta Fa egy valamivel absztrakt módszer 'másolat'.

nyilvános absztrakt osztályfa {// ... nyilvános absztrakt fa másolat (); }

Tegyük fel, hogy két különböző megvalósításunk van Fa hívott PlasticTree és Fenyőfa:

a PlasticTree nyilvános osztály kiterjeszti a fát {// ... @Orride public tree copy () {PlasticTree plasticTreeClone = new PlasticTree (this.getMass (), this.getHeight ()); plasticTreeClone.setPosition (this.getPosition ()); vissza műanyagTreeClone; }}
a PineTree public class kiterjeszti a fát {// ... @Orride public tree copy () {PineTree pineTreeClone = new PineTree (this.getMass (), this.getHeight ()); pineTreeClone.setPosition (this.getPosition ()); visszatér fenyőTreeClone; }}

Tehát itt látjuk, hogy az osztályok kiterjednek Fa és végrehajtja a másolat módszer prototípusként működhet önmaguk másolatának elkészítéséhez.

A prototípus minta lehetővé teszi az objektumok másolatának létrehozását anélkül, hogy a konkrét osztályok függnének. Tegyük fel, hogy van egy listánk a fákról, és szeretnénk ezekből másolatokat készíteni. A polimorfizmus miatt könnyen létrehozhatunk több példányt a fafajták ismerete nélkül.

5. Tesztelés

Most teszteljük:

public class TreePrototypesUnitTest {@Test public void givenAPlasticTreePrototypeWhenClonedThenCreateA_Clone () {// ... PlasticTree plasticTree = new PlasticTree (tömeg, magasság); plasticTree.setPosition (pozíció); PlasticTree anotherPlasticTree = (PlasticTree) plasticTree.copy (); anotherPlasticTree.setPosition (otherPosition); assertEquals (pozíció, plasticTree.getPosition ()); assertEquals (otherPosition, anotherPlasticTree.getPosition ()); }}

Látjuk, hogy a fát klónozták a prototípusból, és két különböző példányunk van PlasticTree. Nemrég frissítettük a klón helyzetét és megtartottuk a többi értéket.

Most klónozzuk a fák listáját:

@Test public void givenA_ListOfTreesWhenClonedThenCreateListOfClones () {// PlasticTree és PineTree List fák példányainak létrehozása = Arrays.asList (plasticTree, pineTree); Lista treeClones = fák.stream (). Map (Fa :: másolat) .collect (toList ()); // ... assertEquals (magasság, műanyagTreeClone.getHeight ()); assertEquals (pozíció, műanyagTreeClone.getPosition ()); }

Figyeljük meg, hogy itt képesek vagyunk a lista mély másolatát elkészíteni anélkül, hogy függnénk a Fa.

6. Előnyök és hátrányok

Ez a minta akkor hasznos, ha új objektumunk csak kissé különbözik a meglévőtől. Bizonyos esetekben előfordulhat, hogy az osztályban csak néhány állapotkombináció van. Tehát új példányok létrehozása helyett előzetesen létrehozhatjuk a megfelelő állapotú példányokat, majd klónozhatjuk őket, amikor csak akarjuk.

Néha találkozhatunk olyan alosztályokkal, amelyek csak állapotukban különböznek egymástól. Megszüntethetjük ezeket az alosztályokat úgy, hogy prototípusokat készítünk a kezdeti állapottal, majd klónozzuk őket.

A prototípus mintát, csakúgy, mint minden más tervezési mintát, csak megfelelő esetben szabad használni. Mivel klónozzuk az objektumokat, a folyamat bonyolulttá válhat, ha sok osztály van, és ez rendetlenséget eredményez. Ezenkívül nehéz körkörös hivatkozásokkal rendelkező osztályokat klónozni.

7. Következtetés

Ebben az oktatóanyagban megismertük a Prototype minta kulcsfontosságú fogalmait, és megtudtuk, hogyan lehet ezt Java-ban megvalósítani. Megvitattuk néhány előnyét és hátrányát is.

Szokás szerint a cikk forráskódja elérhető a Github oldalon.