Evgenii Legotckoi
Evgenii Legotckoi19 вересня 2018 р. 10:27

Шаблони проектування, що породжують - Прототип

Голи

  • Вказати типи об'єктів для створення з використанням екземпляра прототипу та створити нові об'єкти, скопіювавши цей прототип.
  • Створити один екземпляр класу для використання як вихідника всіх майбутніх екземплярів.
  • Оператор new вважається шкідливим

Проблеми

Програма має жорстку прив'язку до класу об'єкта під час використання оператора new.


Обговорення

Оголосіть абстрактний базовий клас, який визначає чистий віртуальний метод clone і підтримує словник усіх клонованих конкретних похідних класів. Будь-який клас, який потребує можливості «поліморфного конструктора»: витягується з абстрактного базового класу, реєструє його прототипний екземпляр та реалізує операцію clone().

Потім клієнт замість писати код, який викликає оператор new на ім'я похідного класу, викликає операцію «clone» в абстрактному базовому класі, надаючи рядковий або нумерований тип даних, який позначає конкретний похідний клас.

Структура

Фабрика знає, як знайти правильний прототип, і кожен клас знає, як породжувати нові екземпляри себе.

Приклад

Шаблон Prototype вказує тип об'єктів, які створюються з використанням прототипу. p align="justify"> Прототипи нових продуктів часто будуються до повного виробництва, але в цьому прикладі прототип є пасивним і не бере участі в копіюванні. Мітотичний поділ клітини, що призводить до двох ідентичних клітин, є прикладом прототипу, який відіграє активну роль у копіюванні і таким чином демонструє зразок прототипу. Коли клітина розщеплюється, з'являються дві клітини ідентичного генотипу. Іншими словами, клітина сама себе клонує.

Контрольний список

  1. Додати метод "clone" до існуючої ієрархії класів
  2. Створіть реєстр, який підтримує кеш прототипових об'єктів. Реєстр може бути інкапсульований у новий клас Factory або базовий клас.
  3. Створіть фабричний метод, який: може (або може бути ні) приймати аргументи, знаходити правильний об'єкт-прототип, викликати clone() для цього об'єкта та повертати результат.
  4. Клієнт замінює всі виклики оператора на нові виклики заводського методу.

Емпіричні правила

  • Іноді шаблонами створення є конкуренти: трапляються випадки, коли можна використовувати Prototype або Abstract Factory. В інших випадках вони доповнюють один одного: Abstract Factory може зберігати набір прототипів, з яких можна клонувати та повертати об'єкти. Abstract Factory, Builder та Prototype можуть використовувати Singleton у своїх реалізаціях.
  • Класи Abstract Factory часто реалізуються за допомогою Factory Methods, але вони можуть бути реалізовані за допомогою Prototype.
  • Фабричний метод: створення через успадкування. Прототип: створення делегування.
  • Часто проекти починаються з використання Factory Method (менш складні, настроювані, підкласи розмножуються) і розвиваються в напрямку Abstract Factory, Prototype або Builder (гнучкіші, складніші), оскільки розробник виявляє, що потрібно більше гнучкості.
  • Прототип не вимагає підкласів, але для цього потрібна операція "іnitіalize". Фабричний метод потребує підкласифікації, але не вимагає ініціалізації.
  • Конструкції, які часто використовують шаблони Composite та Decorator, часто можуть також використовувати Prototype.
  • Прототип створює один екземпляр класу для використання як творця всіх майбутніх екземплярів.
  • Прототипи корисні, коли ініціалізація об'єктів коштує дорого, і ви очікуєте незначних змін параметрів ініціалізації. У цьому контексті Prototype може уникнути дорогого «створення з нуля» та підтримувати дешеве клонування попередньо ініціалізованого прототипу.
  • Прототип унікальний серед інших шаблонів створення, оскільки для нього не потрібний клас – лише об'єкт. Об'єктно-орієнтовані мови, такі як Self та Omega, які усувають класи, повністю покладаються на прототипи для створення нових об'єктів.
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах