Design patterns
Шаблон прототипа
Поиск…
Вступление
Шаблон 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 .