Поиск…


Вступление

Шаблон Prototype - это шаблон создания, который создает новые объекты путем клонирования существующего объекта прототипа. Шаблон прототипа ускоряет создание классов при копировании объектов быстрее.

замечания

Шаблон прототипа - это шаблон создания. Он используется, когда тип создаваемых объектов определяется прототипом экземпляра, который «клонируется» для создания новых объектов.

Этот шаблон используется, когда классу нужен «полиморфный (копирующий) конструктор» .

Шаблон прототипа (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; }
};

Это позволяет построить производный класс из указателя базового класса:

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();

Шаблон прототипа (C #)

Шаблон прототипа может быть реализован с использованием интерфейса ICloneable в .NET.

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

Шаблон прототипа (JavaScript)

В классических языках, таких как Java, C # или C ++, мы начинаем с создания класса, а затем можем создавать новые объекты из класса или расширять класс.

В JavaScript сначала мы создаем объект, затем мы можем увеличить объект или создать из него новые объекты. Поэтому я думаю, что JavaScript демонстрирует фактический прототип, чем классический язык.

Пример :

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";
    }
};

Здесь мы создаем объект Customer , а затем без создания нового объекта мы расширили существующий Customer object используя ключевое слово prototype . Этот метод известен как Prototype Pattern .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow