Перейти к основному содержимому

Что это такое

Паттерн Прототип (Prototype) создаёт новые объекты, клонируя уже существующий, а не собирая их с нуля. Вы готовите один объект как шаблон, затем копируете его и меняете только то, что отличается.

Главное, что нужно сделать правильно в Python: поверхностная копия (copy.copy) использует общие списки и словари внутри объекта — copy.deepcopy копирует и их, поэтому клон становится по-настоящему независимым.


Пример: шаблон документа

Шаблон содержит части, которые повторяются в каждом документе. clone() использует copy.deepcopy — вместе со списком тегов, — поэтому изменение копии не затрагивает шаблон.

Клонируем, затем меняем отличия

Отчёт получил новый заголовок и дополнительный тег, а у шаблона по-прежнему только ['draft'] — потому что copy.deepcopy скопировал список тегов. Поверхностная копия copy.copy сделала бы этот список общим, и шаблон тоже изменился бы.

Prompt
Напишите программу на Python с dataclass Document (title, footer, список tags) и методом clone, который использует copy.deepcopy, чтобы список tags тоже копировался. Клонируйте шаблон в отчёт, измените заголовок отчёта и добавьте тег, затем выведите оба объекта, чтобы показать, что шаблон не изменился.
Вывод: полная программа на Python

Когда использовать

Используйте его, когда новые объекты в основном являются копиями заранее подготовленного — документы из шаблона, игровые сущности из генератора, тестовые данные из фикстуры.

Не используйте его, когда объекты дёшево создавать заново или в них нет ничего общего. Для плоского объекта из простых значений поверхностная копия copy.copy уже является полной копией.


Плюсы и минусы

Плюсы: дешёвое создание заранее настроенных объектов; шаблон наглядно показывает значения по умолчанию; нет повторяющегося кода настройки.

Минусы: при копировании легко допустить незаметную ошибку — поверхностная копия не в том месте тихо связывает клон и оригинал через общий список или словарь; со временем клоны незаметно расходятся с шаблоном.