Найти в Дзене

Паттерн "Прототип". Что это вообще такое?

Давайте представим, что у нас есть Барсик. И он нам настолько сильно нравится, что мы хотим создать полную его копию. В реальной жизни, конечно, мы так не можем сделать. Но вот в коде мы можем создать новый объект класса котика и вручную указать новому коту все параметры и их значения, которые были у Барсика. Звучит отлично, но проблема в том, что у Барсика какие-то поля могут быть приватными и мы не можем получить их значения. Плюс, иногда мы вообще не имеем доступа к Барсику и общаемся с ним через интерфейсы (например, когда используем сторонние библиотеки). Паттерн "Прототип" как раз поможет скопировать объект так, что мы не будем зависеть от конкретных классов и у нас будет точная копия Барсика. Теперь немного умных слов. Прототип — это порождающий шаблон проектирования (помогает с созданием объектов), который создаёт новые объекты через клонирование существующего. Этот подход эффективен, когда процесс инициализации занимает много времени или ресурсов. Пример: Допустим, у нас ес
Оглавление

Давайте представим, что у нас есть Барсик. И он нам настолько сильно нравится, что мы хотим создать полную его копию. В реальной жизни, конечно, мы так не можем сделать. Но вот в коде мы можем создать новый объект класса котика и вручную указать новому коту все параметры и их значения, которые были у Барсика. Звучит отлично, но проблема в том, что у Барсика какие-то поля могут быть приватными и мы не можем получить их значения. Плюс, иногда мы вообще не имеем доступа к Барсику и общаемся с ним через интерфейсы (например, когда используем сторонние библиотеки).

Паттерн "Прототип" как раз поможет скопировать объект так, что мы не будем зависеть от конкретных классов и у нас будет точная копия Барсика.

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

Пример:

Допустим, у нас есть класс Kitten:

class Kitten(val name: String, val age: Int, val breed: String)

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

1) Создаём интерфейс прототипа с одним методом clone;

2) Добавляем интерфейс к котёнку и переопределяем метод;

3) В котёнке в методе просто создаём нового кота. Без запросов в БД и т.п.

-2

4) Теперь, вместо ручного создания новых котят, мы можем просто клонировать существующих:

-3

Заметьте, что в котлине есть функция copy, которая расширяет паттерн "Прототип". С copy можно не только создать нового котика, но и поменять параметры.

Плюсы паттерна:

  1. Производительность и эффективность: если создание нового котика объекта занимает много времени или ресурсов (например, включает обращение к базе данных), то клонирование существующего котика может быть более эффективным.
  2. Изоляция от конкретных классов: код не зависит от конкретного Барсика, поскольку этот код работает через общий интерфейс.
  3. С помощью прототипа можно добавлять новых котиков в любой момент, копируя уже существующие.

Минусы:

  1. Сложность клонирования сложных котиков: клонирование объектов, которые имеют сложные взаимосвязи, может быть трудной задачей из-за необходимости копирования всех связанных объектов и перепривязки ссылок. Например: у нас есть автор и книги. Мы клонировали автора. Казалось бы всё хорошо, но проблема в том, что книги ссылаются на старого автора и ничего не знают про нового. Вот это тоже нужно исправлять.
  2. Копирование может требовать дополнительную память: например, когда мы копируем большие картинки и они будут дублироваться в памяти, то это может быть очень дорогостоящей операцией.
  3. Неправильное клонирование может привести к проблемам безопасности: например, если мы скопировали какие-нибудь пароли и клонированный объект хранится в незащищенной части, откуда пароль может получить кто-то, кто не должен.

UML-схемка:

-4

Красивая картинка от Midjourney:

-5

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes

P.S. сделано с помощью ChatGPT. :)