Главная страница
Навигация по странице:

  • Описание паттерна Prototype

  • UML-диаграмма классов паттерна Prototype

  • Реализация паттерна Prototype // Код под спойлером

  • Результаты применения паттерна Prototype Достоинства паттерна Prototype

  • Недостатки паттерна Prototype Каждый тип создаваемого продукта должен реализовывать операцию клонирования clone(). В случае, если требуется глубокое копирование

  • Паттерн Prototype. 22. Паттерн Prototype. 22. Паттерн Prototype


    Скачать 37.57 Kb.
    Название22. Паттерн Prototype
    АнкорПаттерн Prototype
    Дата29.01.2022
    Размер37.57 Kb.
    Формат файлаdocx
    Имя файла22. Паттерн Prototype.docx
    ТипДокументы
    #345763

    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(). В случае, если требуется глубокое копирование объекта (объект содержит ссылки или указатели на другие объекты), это может быть непростой задачей.


    написать администратору сайта