Реализация шаблона прототипа в Python

Шаблон проектирования прототипа является одним из шаблонов творческого проектирования. Этот шаблон позволяет нам создавать новые объекты (экземпляры) путем клонирования существующих объектов. Новые объекты не зависят от классов, из которых они скопированы.

Предыдущий узел в связанном списке:



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

Создание объекта часто является сложной задачей в приложениях. Следовательно, это дорогостоящий процесс. Рассмотрим достаточно большой и сложный класс. У него слишком много параметров. Некоторые из этих параметров требуют сложных расчетов. Некоторые из них извлекаются путем извлечения данных из базы данных. Представьте, что все эти операции повторяются снова и снова для каждого состояния, даже если разница между новым объектом и другими имеющимися объектами очень мала.

Обозначим определенное состояние этого объекта как прототип. Затем мы копируем (клонируем) этот объект-прототип всякий раз, когда нам нужен его экземпляр. Свойства этого нового клонированного объекта будут такими же, как у прототипа. Обновляются только те уникальные свойства, которыми должен обладать этот новый объект (при необходимости можно определить более одного прототипа для различных ситуаций). В результате он уменьшает исходный код, необходимый для создания новых объектов.

Если объекты, которые могут быть созданы из класса, имеют в системе состояния, не очень далекие друг от друга, мы можем предпочесть шаблон проектирования прототипа. Этот класс имеет разные функциональные возможности, когда находится в разных состояниях системы. Вместо того, чтобы создавать новый объект с нуля при каждом изменении состояния, мы можем клонировать объект из объекта-прототипа, чтобы обеспечить необходимый экземпляр для каждого состояния.

У него есть общие точки с шаблоном проектирования состояний из-за возможностей, которые он предоставляет для создания объектов при изменении состояния. Кроме того, сочетание заводского шаблона проектирования и шаблона проектирования прототипа дает отличные результаты, когда это применимо.

Проблема с доменом

Мы получили большой заказ от Старкиллера и нам нужно произвести батальон штурмовиков. Однако у нас есть проблема. Мы не знаем, как сделать штурмовика, потому что потеряли рецепт. У нас есть 2 варианта; Либо мы отправляем команду на планету Мимба и получаем рецепт (думайте об этом как об общей стоимости создания объекта), либо мы пробуем солдата из последних рук и клонируем его.

Кодирование

Прежде чем мы начнем программировать, давайте вспомним наши знания о методах копирования в Python:

Изменения, внесенные в объект, скопированный с помощью глубокой копии, не происходят в исходном объекте. С другой стороны, объект, созданный с помощью поверхностной копии, имеет ту же ссылку, что и исходный объект. Таким образом, изменения, сделанные в новой копии, также отражаются в оригинале.

Давайте двигаться дальше. У нас есть абстрактный класс Prototype и предыдущая модель класса Stormtrooper. У нас есть метод clone, который копирует себя с помощью deepcopy и возвращает новый клонированный экземпляр.

«И что, вся эта суета была только из-за команды глубокого копирования в одну строку?» Я слышу, как ты говоришь. Магия здесь в том, что этот метод clone настраивается в зависимости от ситуации и варианта использования. Здесь в игру вступает абстракция. Благодаря deepcopy мы получаем новый объект без необходимости его повторного создания. С помощью абстракции мы можем настроить этот процесс в соответствии с нашими потребностями. Например, мы можем создать новый прототип клонирования, увеличив силу атаки каждого клона для получения нового объекта (допустим, приземлились модели 2022 года).

Спасибо за прочтение. Если у вас есть какие-либо вопросы или комментарии, пожалуйста, напишите мне!

Следующий эпизод:



Читать далее…



Рекомендации

https://en.wikipedia.org/wiki/Prototype_pattern

https://refactoring.guru/design-patterns/prototype

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.