Прототип (шаблон проектирования)
Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Прототип, (англ. 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(); } } }
[править] См. также
| порождающие шаблоны проектирования |
| абстрактная фабрика | строитель | фабричный метод | прототип | одиночка | отложенная инициализация |
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:原型模式