Прототип (шаблон проектирования)
Прототип, (англ. Prototype) — порождающий шаблон проектирования.
Назначение
Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа...
Проще говоря, это паттерн создания объекта через клонирование другого объекта вместо создания через конструктор.
Применимость
Паттерн используется чтобы:
- избежать дополнительных усилий по созданию объекта стандартным путем (имеется ввиду использование ключевого слова 'new', когда создается не только сам объект, а и вся иерархия предков объекта), когда это непозволительно дорого для приложения.
- избежать наследования создателя объекта (object creator) в клиентском приложении, как это делает паттерн abstract factory.
Используйте этот шаблон проектирования, когда система не должна зависеть от того, как в ней создаются, компонуются и представляются продукты:
- инстанцируемые классы определяются во время выполнения, например с помощью динамической загрузки;
- для того чтобы избежать построения иерархий классов или фабрик, параллельных иерархии классов продуктов;
- экземпляры класса могут находиться в одном из нескольких различных состояний. Может оказаться удобнее установить соответствующее число прототипов и клонировать их, а не инстанцировать каждый раз класс вручную в подходящем состоянии.
Примеры
Пример Java
/**
* Prototype Class
*/
public class Cookie implements Cloneable {
@Override
public Cookie clone() throws CloneNotSupportedException {
// call Object.clone()
Cookie copy = (Cookie) super.clone();
//In an actual implementation of this pattern you might now change references to
//the expensive to produce parts from the copies that are held inside the prototype.
return copy;
}
}
/**
* Concrete Prototypes to clone
*/
public class CoconutCookie extends Cookie { }
/**
* Client Class
*/
public class CookieMachine {
private Cookie cookie; // Could have been a private Cloneable cookie.
public CookieMachine(Cookie cookie) {
this.cookie = cookie;
}
public Cookie makeCookie() {
return (Cookie) this.cookie.clone();
}
public static void main(String args[]) {
Cookie tempCookie = null;
Cookie prot = new CoconutCookie();
CookieMachine cm = new CookieMachine(prot);
for (int i = 0; i < 100; i++)
tempCookie = cm.makeCookie();
}
}
Пример C#
using System;
namespace Prototype
{
class MainApp
{
static void Main()
{
// Create two instances and clone each
ConcretePrototype1 p1 = new ConcretePrototype1("I");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
Console.WriteLine ("Cloned: {0}", c1.Id);
ConcretePrototype2 p2 = new ConcretePrototype2("II");
ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();
Console.WriteLine ("Cloned: {0}", c2.Id);
// Wait for user
Console.Read();
}
}
// "Prototype"
abstract class Prototype
{
private string id;
// Constructor
public Prototype(string id)
{
this.id = id;
}
// Property
public string Id
{
get{ return id; }
}
public abstract Prototype Clone();
}
// "ConcretePrototype1"
class ConcretePrototype1 : Prototype
{
// Constructor
public ConcretePrototype1(string id) : base(id)
{
}
public override Prototype Clone()
{
// Shallow copy
return (Prototype)this.MemberwiseClone();
}
}
// "ConcretePrototype2"
class ConcretePrototype2 : Prototype
{
// Constructor
public ConcretePrototype2(string id) : base(id)
{
}
public override Prototype Clone()
{
// Shallow copy
return (Prototype)this.MemberwiseClone();
}
}
}
См. также
порождающие шаблоны проектирования |
абстрактная фабрика | строитель | фабричный метод | прототип | одиночка | отложенная инициализация |
bg:Прототип (шаблон) ca:Prototype de:Prototyp (Entwurfsmuster) en:Prototype pattern es:Prototype (patrón de diseño) fr:Prototype (patron de conception) he:תבנית Prototype it:Prototype pattern ko:Prototype 패턴 pl:Prototyp (wzorzec projektowy) pt:Prototype uk:Прототип (шаблон проектування) zh:原型模式
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....