printПорождающие паттерны

printПрототип

Prototype

Назначение
Задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа.

Результаты
1. Паттерн прототип позволяет добавлять и удалять продукты во время выполнения.
2. Можно определять новые виды объектов, инстанцируя уже существующие классы, изменяя значений полей и регистрируя экземпляры как прототипы клиентских объектов. В результате число необходимых системе классов может быть уменьшено.
3. Многие приложения строят объекты из более мелких составляющих. В этом случае можно определять новые виды объектов путем изменения структуры.
4. Можно избавиться от иерархии класса Creator в паттерне фабричный метод, если не запрашивать фабричный метод создать новый объект, а клонировать прототип.
5. Возможно динамическое конфигурирование приложения классами, если исполняющая среда будет автоматически создавать экземпляр каждого класса и регистрировать экземпляр в диспетчере прототипов. Затем приложение может запросить у диспетчера прототипов экземпляры вновь загруженных классов, которые изначально не были связаны с программой.
6. Каждый подкласс иерархии Prototype и их составляющие должны реализовывать операцию Clone, но ее добавление может оказаться затруднительным, если используются уже существующие классы.

Структура
14676.png

Реализация
// Прототип объявляет интерфейс для клонирования самого себя
class Prototype {
public:
  virtual Prototype *Clone()=0;
};
// Конкретные прототипы реализуют операцию клонирования себя
class Prototype1 : public Prototype {
  Prototype1(const Prototype1 &);
public:
  Prototype1 *Clone() { return new Prototype1(*this); }
};
class Prototype2 : public Prototype {
  Prototype2(const Prototype2 &);
public:
  Prototype2 *Clone() { return new Prototype2(*this); }
};
// Образец
Prototype *proto;
// Создание объектов в клиенте
Prototype *p=proto->Clone();
loading