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

Что это такое

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

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


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

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

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

У отчёта появился новый заголовок и дополнительный тег, а в шаблоне по-прежнему только [черновик] — потому что Clone() скопировал срез, а не сделал его общим.

Prompt
Напишите программу на Go со структурой Document (заголовок, нижний колонтитул, срез тегов) и методом Clone, который копирует документ вместе со срезом тегов. Клонируйте шаблон в отчёт, измените заголовок отчёта и добавьте тег, затем выведите оба, чтобы показать, что шаблон не пострадал.
Вывод: программа на Go и захваченный вывод

Когда это применять

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

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


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

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

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