factory method pattern
Megjelenés
Főnév
factory method pattern (tsz. factory method patterns)
- (informatika) A Factory Method pattern (gyári metódus minta) egy kreációs (példányosító) tervezési minta, amely lehetővé teszi, hogy az objektumok példányosítását a származtatott osztályokra bízzuk, nem pedig közvetlenül a klienskódra. Ahelyett, hogy a
newkulcsszót közvetlenül használnánk, egy absztrakt metódus hozza létre a megfelelő példányt – így a kód rugalmasabban bővíthető és testreszabható.
🧠 Miért hasznos?
- Ha a példányosítási logika változik, de a klienskódot nem akarod módosítani.
- Ha a létrehozott objektum altípusa a futásidő során dől el.
- Ha egy rendszer sokféle terméket hoz létre, de a létrehozási módot el akarod különíteni.
🎯 Cél
- A példányosítás kiterjeszthetővé tétele (új típus hozzáadása nem módosítja az alap kódot).
- Elősegíti a nyitott/zárt elv (Open/Closed Principle) betartását.
- A
newkulcsszó kapszulázása a klienskódból.
🧱 Felépítés
- Creator (Alap osztály vagy interfész): tartalmaz egy absztrakt
factoryMethod()függvényt, amely létrehozza a terméket. - ConcreteCreator: implementálja a
factoryMethod()-ot. - Product (Termék interfész vagy absztrakt osztály): az előállított objektum absztrakt típusa.
- ConcreteProduct: a konkrét példány.
🔧 Példa (C++)
// Termék interfész
class Product {
public:
virtual void use() const = 0;
virtual ~Product() {}
};
// Konkrét termék
class ConcreteProductA : public Product {
public:
void use() const override {
std::cout << "Using Product A\n";
}
};
// Konkrét termék
class ConcreteProductB : public Product {
public:
void use() const override {
std::cout << "Using Product B\n";
}
};
// Gyár osztály (Creator)
class Creator {
public:
virtual Product* factoryMethod() const = 0;
void operation() const {
Product* p = factoryMethod();
p->use();
delete p;
}
virtual ~Creator() {}
};
// Konkrét gyár (ConcreteCreator)
class ConcreteCreatorA : public Creator {
public:
Product* factoryMethod() const override {
return new ConcreteProductA();
}
};
class ConcreteCreatorB : public Creator {
public:
Product* factoryMethod() const override {
return new ConcreteProductB();
}
};
🔨 Használat
int main() {
Creator* creator = new ConcreteCreatorA();
creator->operation(); // Product A
delete creator;
creator = new ConcreteCreatorB();
creator->operation(); // Product B
delete creator;
return 0;
}
✅ Előnyök
- Elrejti az objektum példányosítását a klienskód elől.
- Egyszerűen bővíthető új típusokkal (új
ConcreteCreatorosztály). - Laza csatolás: a kliens csak a
Productinterfészt ismeri.
❌ Hátrányok
- Több osztály: minden új terméktípushoz új osztályt kell létrehozni.
- Bonyolultabb lehet kis projektekben.
🧪 Használati példák
- Grafikus felhasználói felületek (pl. különböző gomb típusok: Windows vs. macOS)
- Játékfejlesztés: különböző ellenségek/karakterek generálása
- Dokumentumkezelés: új fájltípus példányosítása (PDF, TXT, DOCX)
- Szerver oldali válaszgenerálás különféle kérés típusokra
🆚 Factory Method vs Abstract Factory
| Factory Method | Abstract Factory | |
|---|---|---|
| Mit hoz létre? | Egy terméket | Egymással kapcsolódó objektumokat (családot) |
| Példányosítás típusa | Egy termékpéldány/metódus | Több termék, több interfész |
| Bonyolultság | Közepes | Magas (összetettebb hierarchia) |
| Használati eset | Egyedi példányok | Összefüggő objektumok létrehozása együtt |
📌 TL;DR
- A Factory Method minta egy absztrakció az objektum példányosítására.
- Lehetővé teszi, hogy a példányosítás részleteit a leszármazott osztályra bízzuk.
- Erőteljes eszköz a nyitott/zárt elv alkalmazásához, ha jól strukturált kódot szeretnénk.
- factory method pattern - Szótár.net (en-hu)
- factory method pattern - Sztaki (en-hu)
- factory method pattern - Merriam–Webster
- factory method pattern - Cambridge
- factory method pattern - WordNet
- factory method pattern - Яндекс (en-ru)
- factory method pattern - Google (en-hu)
- factory method pattern - Wikidata
- factory method pattern - Wikipédia (angol)