prototype pattern (tsz. prototype patterns)
A Prototype minta lényege, hogy:
clone()
metódust.clone()
metódust, amely visszaadja az adott objektum egy másolatát.new
kulcsszóval hozzuk létre, hanem egy meglévő objektum alapján, klónozással.
class Prototype {
public:
virtual Prototype* clone() const = 0;
virtual void print() const = 0;
virtual ~Prototype() {}
};
class ConcretePrototype : public Prototype {
private:
int value;
public:
ConcretePrototype(int v) : value(v) {}
Prototype* clone() const override {
return new ConcretePrototype(*this); // másolatkészítés
}
void print() const override {
std::cout << "Érték: " << value << std::endl;
}
};
void clientCode(const Prototype& prototype) {
Prototype* newObject = prototype.clone();
newObject->print();
delete newObject;
}
Ebben a példában egy konkrét objektum klónozásával új példányt készítünk, anélkül hogy a konstruktorát hívnánk közvetlenül.
clone()
metódust.clone()
metódust.clone()
metódussal anélkül, hogy ismerné a konkrét osztályt.
✅ Futásidőben lehet másolatokat készíteni.
✅ Elkerülhető a bonyolult konstruktorhívás.
✅ Elősegíti az objektumalapú megközelítést az osztályalapú helyett.
✅ Jól működik komplex objektumstruktúrákkal.
❌ Bonyolult lehet, ha sokféle objektum van és bonyolult a klónozás (pl. mély másolat).
❌ Platform- vagy nyelvspecifikus támogatás kellhet (pl. Cloneable
Java-ban, clone()
C++-ban kézzel implementálandó).
Mintatípus | Leírás |
---|---|
Prototype | Objektum másolatát hozza létre futásidőben. |
Factory Method | Osztály példányosítását delegálja alosztályokra. |
Abstract Factory | Objektumcsaládokat példányosít. |
Builder | Bonyolult objektumokat állít össze lépésről lépésre. |
public abstract class Shape implements Cloneable {
private String id;
protected String type;
abstract void draw();
public String getType() {
return type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Object clone() {
Object clone = null;
try {
clone = super.clone(); // sekély másolat
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
Gyakran használják a Prototype Registry fogalmát: egy tároló (pl. map<string, Prototype*>
), amely előregyártott példányokat tartalmaz, és ezekből lehet klónozni.
class PrototypeRegistry {
private:
std::map<std::string, Prototype*> prototypes;
public:
void addPrototype(const std::string& key, Prototype* proto) {
prototypes = proto;
}
Prototype* create(const std::string& key) {
return prototypes->clone();
}
};
A Prototype minta: