Abstract factory

Az abstract factory tervezési minta igen közel áll a factory method tervezési mintához. Gyakorlatilag azok egy csoportját fogja össze. Erre akkor van szükség, ha több féle objektumot kell tudni létrehozni, de nem tetszőleges kombinációban, hanem az egymásnak megfelelőeket. Ekkor egy abstract factory összefogja a factory methodokat és amikor példányosítani kell valamit, akkor mindig az éppen aktuális abstract factory megfelelő factory methodját fogjuk használni.

Bevezető példa

Ha például valamilyen adatsor alapján akarunk dokumentumokat (pl. reportokat) generálni és erre több “design” is rendelkezésre áll (pl. minimál, modern, kaligrafikus stb.), akkor ezek mint abstract factory tartalmazhatnak bekezdés, ábra és táblázat generáló objektumokat (factory methodokat). Így ha egyszer kiválasztottuk a designt, akkor utána minden annak megfelelően generálódik. És ehhez mindössze annyit kell tenni, hogy a dokumentum generálónak a designnak megfelelő abstract factory egy példányát kell átadni, hogy “ezt használd minden létrehozásához”.

Részletek

Az abstract factory egymástól függő objektumok egy családját létrehozó interfészt ad anélkül, hogy a konkrét osztályokat specifikálná. Factory method csoportokat fog össze. Olyan csoportokat, hogy a létrehozott termékek összeférhetőek legyenek. (Ez olyan, mint egy Linux disztribúció telepítője: ott is csomagok egy egymással kompatibilis halmazát telepítjük.)

Ez tipikusan akkor hasznos, ha cserélhető komponenseink vannak, de azokat nem lehet tetszőlegesen, egymástól függetlenül cserélni, csak bizonyos kombinációkban.

Az abstract factory osztálydiagramja az alábbi:

A létrehozás helyén csak egy AbstractFactory referenciánk van és annak tudjuk a createProductA és createProductB metódusát meghívni. Azt, hogy valójában az 1-es vagy 2-es termékcsoport A vagy B termékét hozzuk létre, azt az határozza meg, hogy valójában egy ConcreteFactory1 vagy ConcreteFactory2 példányt használunk.

Előnyök

Hátrányok

Megjegyzések

Példa: platform függőség

Platform függőség kezelése esetén az abstract factory egy kombinációja az oprendszernek (pl. fájlkezelést hogyan kell megoldani), kommunikációs protokollnak, használt adatbázisnak. Ennek szükségességét például az jelzi, ha már nagyon sok az #ifdef (platform feltétellel) a kódban.

Példa: look-and-feel

Tipikus look-and-feel implementáció az abstract factory: a kiválasztott témának megfelelő abstract factory fogja létrehozni a felhasználói felület elemeit.

További példák

Az alábbi példák a factory method és az abstract factory minták határán vannak, mivel a kettő között sokszor elég keskeny a határ.

További olvasnivaló

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