Sobes.tech
Назад к вопросам
Junior — Middle
49

Можешь привести пример, когда и как применяется паттерн Prototype в проектировании объектов?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

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

Определение:

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

Пример использования:

Например, в редакторе документов есть шаблон оформления отчёта: шрифты, поля, стиль заголовков, структура страниц. Когда пользователь создаёт новый отчёт, система берёт шаблонный объект и клонирует его, а затем меняет только название, автора и несколько полей.

class Report implements Cloneable {
    private String title;
    private String author;

    public Report(String title, String author) {
        this.title = title;
        this.author = author;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Report copy() {
        try {
            return (Report) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public String toString() {
        return "Report{title='" + title + "', author='" + author + "'}";
    }
}

public class Main {
    public static void main(String[] args) {
        Report template = new Report("Template", "System");
        Report userReport = template.copy();
        userReport.setTitle("Q1 Report");

        System.out.println(template);
        System.out.println(userReport);
    }
}

Пояснение кода:

Код показывает типичный сценарий Prototype: есть объект-шаблон template, от которого создаётся копия методом copy(). Внутри copy() вызывается super.clone(), то есть создаётся новый объект с тем же состоянием полей. После клонирования копия изменяется независимо от шаблона, например меняется title. В результате новый объект получается быстрее, чем если бы его полностью собирали заново.

Ключевые моменты:

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