creational pattern (tsz. creational patterns)
👉 Ezek a minták elválasztják az objektum létrehozását annak használatától, és segítenek elkerülni a “hard-coded new
” hívásokat.
Minta | Rövid célja |
---|---|
Singleton | Egyetlen példány biztosítása egy osztályból |
Factory Method | Alosztály dönt a példányosításról |
Abstract Factory | Objektumcsaládok példányosítása, interfészen keresztül |
Builder | Összetett objektum lépésenkénti építése |
Prototype | Objektum klónozása meglévő példány alapján |
Csak egy példány jöhet létre az adott osztályból, és azt globálisan elérhetővé teszi.
class Logger {
private:
static Logger* instance;
Logger() {}
public:
static Logger* getInstance() {
if (!instance)
instance = new Logger();
return instance;
}
void log(const std::string& msg) {
std::cout << "LOG: " << msg << "\n";
}
};
Logger* Logger::instance = nullptr;
A példányosítást alaposztály absztrakt függvénye végzi el, az alosztály dönt, hogy pontosan milyen objektumot hozzon létre.
class Shape {
public:
virtual void draw() = 0;
virtual ~Shape() = default;
};
class Circle : public Shape {
public:
void draw() override { std::cout << "Kör rajzolása\n"; }
};
class ShapeFactory {
public:
virtual Shape* createShape() = 0;
};
class CircleFactory : public ShapeFactory {
public:
Shape* createShape() override {
return new Circle();
}
};
Több egymáshoz tartozó objektumot (pl. UI elemek egy stílusban) hozzunk létre, anélkül, hogy megmondanánk a konkrét osztályokat.
class Button {
public:
virtual void render() = 0;
};
class WinButton : public Button {
void render() override { std::cout << "Windows gomb\n"; }
};
class MacButton : public Button {
void render() override { std::cout << "Mac gomb\n"; }
};
class GUIFactory {
public:
virtual Button* createButton() = 0;
};
class WinFactory : public GUIFactory {
Button* createButton() override {
return new WinButton();
}
};
class MacFactory : public GUIFactory {
Button* createButton() override {
return new MacButton();
}
};
Összetett objektum létrehozása lépésenként, különválasztva az építési folyamatot a végső objektumtól.
class Pizza {
public:
void addTopping(const std::string& topping) {
std::cout << "Hozzáadva: " << topping << "\n";
}
};
class PizzaBuilder {
Pizza* pizza;
public:
PizzaBuilder() { pizza = new Pizza(); }
PizzaBuilder* addCheese() { pizza->addTopping("sajt"); return this; }
PizzaBuilder* addPepperoni() { pizza->addTopping("szalámi"); return this; }
Pizza* build() { return pizza; }
};
Új objektum létrehozása létező példány másolásával, nem new
-vel. Különösen hasznos, ha példányosítás drága (pl. mély példány, konfiguráció).
class Document {
public:
virtual Document* clone() = 0;
virtual void print() = 0;
};
class Report : public Document {
public:
Document* clone() override { return new Report(*this); }
void print() override { std::cout << "Jelentés nyomtatása\n"; }
};
Minta | Példányosítás módja | Előny |
---|---|---|
Singleton | Egyetlen példány | Globális állapot, központi vezérlés |
Factory Method | Alosztály dönt | Bővíthető, de absztrakciós réteg kell |
Abstract Factory | Egységes objektumcsalád | UI témák, plug-in architektúrák |
Builder | Lépésenkénti építés | Testreszabható, olvasható kód |
Prototype | Másolással példányosítás | Gyors másolás, konfigurált alapból |
Probléma | Javasolt minta |
---|---|
Csak egy példány kell | Singleton |
Többféle osztály közül kell választani | Factory Method |
Különböző, kompatibilis objektumokat kell együtt kezelni | Abstract Factory |
Nagyon összetett objektumot építesz | Builder |
Sokat klónozol, vagy drága a new
|
Prototype |