Хранитель (англ. Memento) — поведенческий шаблон проектирования, позволяющий, не нарушая инкапсуляцию, зафиксировать
и сохранить внутреннее состояние объекта так, чтобы позднее восстановить его в это состояние.
Шаблон Хранитель мы реализуем тремя объектами: Player(Создателем), Game(Опекуном) и Save(Хранитель).
Хранитель - это объект, который хранит конкретный снимок состояния некоторого объекта или ресурса: строки,
числа, массива, экземпляра класса и так далее. Уникальность в данном случае подразумевает не запрет на существование
одинаковых состояний в разных снимках, а то, что состояние можно извлечь в виде независимой копии. Любой объект,
сохраняемый в Хранителе, должен быть полной копией исходного объекта, а не ссылкой на исходный объект.
Сам объект Хранитель является «непрозрачным объектом» (тот, который никто не может и не должен изменять).
Создатель — это объект, который содержит в себе актуальное состояние внешнего объекта строго заданного типа
и умеет создавать уникальную копию этого состояния, возвращая её, обёрнутую в объект Хранителя.
Создатель не знает истории изменений. Создателю можно принудительно установить конкретное состояние извне,
которое будет считаться актуальным. Создатель должен позаботиться о том, чтобы это состояние соответствовало
типу объекта, с которым ему разрешено работать. Создатель может (но не обязан) иметь любые методы,
но они не могут менять сохранённое состояние объекта.
Опекун управляет историей снимков состояний. Он может вносить изменения в объект, принимать решение о сохранении
состояния внешнего объекта в Создателе, запрашивать от Создателя снимок текущего состояния,
или привести состояние Создателя в соответствие с состоянием какого-то снимка из истории.