Паттерн Prototype. 22. Паттерн Prototype. 22. Паттерн Prototype
Скачать 37.57 Kb.
|
22. Паттерн PrototypeНазначение паттерна Prototype Паттерн Prototype (прототип) можно использовать в следующих случаях: Система должна оставаться независимой как от процесса создания новых объектов, так и от типов порождаемых объектов. Непосредственное использование выражения new в коде приложения считается нежелательным; Необходимо создавать объекты, точные классы которых становятся известными уже на стадии выполнения программы. Описание паттерна Prototype “Данный шаблон представляет виды объектов с помощью прототипа и позволяет создавать новые объекты в обход ключевого слова new и конструктора, используя вместо этого простое копирование.” Для создания новых объектов паттерн Prototype использует прототипы. Прототип - это уже существующий в системе объект, который поддерживает операцию клонирования, то есть умеет создавать копию самого себя. Таким образом, для создания объекта некоторого класса достаточно выполнить операцию clone() соответствующего прототипа. Паттерн Prototype реализует подобное поведение следующим образом: все классы, объекты которых нужно создавать, должны быть подклассами одного общего абстрактного базового класса. Этот базовый класс должен объявлять интерфейс метода clone(). Также здесь могут объявляться виртуальными и другие общие методы, например, initialize() в случае, если после клонирования нужна инициализация вновь созданного объекта. Все производные классы должны реализовывать метод clone(). UML-диаграмма классов паттерна Prototype Для порождения объекта некоторого типа в системе должен существовать его прототип. Прототип представляет собой объект того же типа, единственным назначением которого является создание подобных ему объектов. Обычно для удобства все существующие в системе прототипы организуются в специальные коллекции-хранилища или реестры прототипов Реализация паттерна Prototype // Код под спойлером using System; namespace Prototype { class MainApp { static void Main() { // Create two instances and clone each Prototype p1 = new ConcretePrototype1("I"); Prototype c1 = p1.Clone(); Console.WriteLine ("Cloned: {0}", c1.Id); Prototype p2 = new ConcretePrototype2("II"); Prototype c2 = 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(); } } } Результаты применения паттерна Prototype Достоинства паттерна Prototype Для создания новых объектов клиенту необязательно знать их конкретные классы. Возможность гибкого управления процессом создания новых объектов за счет возможности динамических добавления и удаления прототипов в реестр. Недостатки паттерна Prototype Каждый тип создаваемого продукта должен реализовывать операцию клонирования clone(). В случае, если требуется глубокое копирование объекта (объект содержит ссылки или указатели на другие объекты), это может быть непростой задачей. |