Ricerca…


introduzione

Il pattern Prototype è un pattern creazionale che crea nuovi oggetti clonando l'oggetto prototipo esistente. Il modello del prototipo accelera l'istanziazione delle classi quando la copia degli oggetti è più veloce.

Osservazioni

Il modello prototipo è un modello di design creativo. Viene utilizzato quando il tipo di oggetti da creare è determinato da un'istanza prototipica, che viene "clonata" per produrre nuovi oggetti.

Questo modello viene utilizzato quando una classe ha bisogno di un "costruttore di materiali polimorfici (copia)" .

Prototype Pattern (C ++)

class IPrototype  {
public:
    virtual ~IPrototype() = default;

    auto Clone() const { return std::unique_ptr<IPrototype>{DoClone()}; }
    auto Create() const { return std::unique_ptr<IPrototype>{DoCreate()}; }

private:
    virtual IPrototype* DoClone() const = 0;
    virtual IPrototype* DoCreate() const = 0;
};

class A : public IPrototype {
public:
    auto Clone() const { return std::unique_ptr<A>{DoClone()}; }
    auto Create() const { return std::unique_ptr<A>{DoCreate()}; }
private:
    // Use covariant return type :)
    A* DoClone() const override { return new A(*this); }
    A* DoCreate() const override { return new A; }
};

class B : public IPrototype {
public:
    auto Clone() const { return std::unique_ptr<B>{DoClone()}; }
    auto Create() const { return std::unique_ptr<B>{DoCreate()}; }
private:
    // Use covariant return type :)
    B* DoClone() const override { return new B(*this); }
    B* DoCreate() const override { return new B; }
};


class ChildA : public A {
public:
    auto Clone() const { return std::unique_ptr<ChildA>{DoClone()}; }
    auto Create() const { return std::unique_ptr<ChildA>{DoCreate()}; }

private:
    // Use covariant return type :)
    ChildA* DoClone() const override { return new ChildA(*this); }
    ChildA* DoCreate() const override { return new ChildA; }
};

Ciò consente di costruire la classe derivata da un puntatore della classe base:

ChildA childA;
A& a = childA;
IPrototype& prototype = a;

// Each of the following will create a copy of `ChildA`:
std::unique_ptr<ChildA> clone1 = childA.Clone();
std::unique_ptr<A> clone2 = a.Clone();
std::unique_ptr<IPrototype> clone3 = prototype.Clone();

// Each of the following will create a new default instance `ChildA`:
std::unique_ptr<ChildA> instance1 = childA.Create();
std::unique_ptr<A> instance2 = a.Create();
std::unique_ptr<IPrototype> instance3 = prototype.Create();

Modello di prototipo (C #)

Il modello prototipo può essere implementato utilizzando l'interfaccia ICloneable in .NET.

class Spoon {
}
class DessertSpoon : Spoon, ICloneable {
  ...
  public object Clone() {
    return this.MemberwiseClone();
  }
}
class SoupSpoon : Spoon, ICloneable {
  ...
  public object Clone() {
    return this.MemberwiseClone();
  }
}

Prototype Pattern (JavaScript)

Nei linguaggi classici come Java, C # o C ++ iniziamo creando una classe e quindi possiamo creare nuovi oggetti dalla classe o estendere la classe.

In JavaScript per prima cosa creiamo un oggetto, quindi possiamo aumentare l'oggetto o creare nuovi oggetti da esso. Quindi penso che JavaScript mostri un prototipo reale rispetto al linguaggio classico.

Esempio :

var myApp = myApp || {};

myApp.Customer = function (){
    this.create = function () {
        return "customer added";
    }
};

myApp.Customer.prototype = {
    read: function (id) {
        return "this is the customer with id = " + id;
    },
    update: function () {
        return "customer updated";
    },
    remove: function () {
        return "customer removed";
    }
};

Qui, creiamo un oggetto denominato Customer , e quindi senza creare nuovo oggetto abbiamo esteso l' Customer object esistente utilizzando la parola chiave prototype . Questa tecnica è conosciuta come Prototype Pattern .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow