Factory method

A factory method célja, hogy egy ősosztály leszármazottjai közül az egyiknek létrehozzuk egy példányát, de azt máshol döntjük el, hogy melyiket.

(A factory method mintánál általánosabb Factory tervezési minta egy olyan objektumot takar, ami másik objektum példányokat hoz létre.)

Bevezető példa: játékprogram pályaszerkesztője

Például egy játék pályaszerkesztőjében kattintásra létre lehet hozni új elemeket. De hogy a kattintás milyen elemet hoz létre, azt az határozza meg, hogy az eszköztárról mit választottunk ki legutoljára. Ennek egy lehetséges megvalósítása az, hogy az egérkattintáshoz “factory objektumokat” lehet hozzárendelni. A kattintás ezután csak azt mondja az éppen aktuális factorynak, hogy hozzon létre egy új elemet. Amikor pedig az eszköztáron kiválasztunk egy másik pályaelemet, akkor lecseréljük a kattintás által használt factory objektumot. (A kattintás eseménykezelője ebből semmit nem vesz észre, mivel a factory objektumokra ő csak a közös ősosztályukra mutató referenciával hivatkozik.)

Részletek

A Factory method tervezési minta osztálydiagramja az alábbi:

A Factory egy ősosztály (itt Creator), melyre a példányosítást kérő kliens például egy referenciával hivatkozik majd. Ezt a referenciát lehet majd az egyes ConcreteCreator osztályok példányaira állítani. Az ősosztály, mint interface, definiálja a példányosító objektumot (tipikusan tisztán absztrakt, virtuális függvényként, de akár alapértelmezett implementációt is tartalmazhat). A kliens amikor szeretne egy Product példányt, azt nem a konstruktorával hozza létre (new operátorral), hanem a Creator::factoryMethod metódus segítségével. Ebből pedig nyilván azé az osztályé fog lefutni, amelyiknek egy példányára a kliens éppen hivatkozik.

Megjegyzések

Szerzők, verziók: Csorba Kristóf