---
title: "Memento - збереження стану"
url: https://laravelukraine.com/blog/memento-zberezennia-stanu
date: 2026-07-23
---

# Memento - збереження стану

Memento дозволяє зберігати знімок стану об'єкта і пізніше відновлювати його, не порушуючи інкапсуляцію.

### Яку проблему вирішує

Щоб реалізувати undo чи відкат, потрібно зберегти й відновити внутрішній стан об'єкта. Якщо робити це ззовні, доведеться відкрити приватні поля назовні - інкапсуляція ламається.

### Як вирішує

Об'єкт сам створює "знімок" (memento) і сам уміє з нього відновитись - зовнішній код тримає знімок, але не зазирає всередину. Зазвичай є три ролі: Originator (об'єкт зі станом), Memento (знімок) і Caretaker (зберігає історію знімків).

```php
class EditorMemento
{
  public function __construct(public string $content) {}
}

class Editor
{
  public function __construct(private string $content = '') {}

  public function setContent(string $content): void
  {
    $this->content = $content;
  }

  public function save(): EditorMemento
  {
    return new EditorMemento($this->content);
  }

  public function restore(EditorMemento $memento): void
  {
    $this->content = $memento->content;
  }
}
```

### Де застосовувати

- Undo/redo у редакторах і формах-чернетках.
- Тимчасові сесії, відкат транзакційних змін у пам'яті.

### Плюси та мінуси

- **+** Зберігає й відновлює стан, не порушуючи інкапсуляцію.
- **+** Caretaker керує історією, не знаючи внутрішньої будови об'єкта.
- **−** Багато або великих знімків швидко з'їдають пам'ять.
- **−** Тоді краще зберігати лише дельти змін або персистити стан у БД/кеш.
