/* Хранитель + Одиночка Не нарушая инкапсуляцию, определяет и сохраняет внутреннее состояние объекта и позволяет позже восстановить объект в этом состоянии */ class Program { public static void Main(string[] args) { #region Пример №1 - базовое using (var hero = new Hero()) { hero.Shoot(); } using (var heroMan = new Hero()) { heroMan.RestoreState(GameHistory.Instance.History.Pop()); heroMan.Shoot(); } Console.ReadKey(); #endregion } } /// /// Класс героя /// class Hero : IDisposable { /// /// Количество патронов /// private int patrons = 10; /// /// Выстрел /// public void Shoot() { if(patrons > 0) { patrons--; Console.WriteLine($"Осталось {patrons} патронов..."); } else Console.WriteLine("Нет патронов"); } /// /// Сохранение состояния /// /// public HeroMemento SaveState() { Console.WriteLine($"Сохранено - {patrons}"); return new HeroMemento(patrons); } /// /// Восстановление состояния /// /// Хранитель состояния public void RestoreState(HeroMemento memento) { patrons = memento.Patrons; Console.WriteLine($"Загружено - {patrons}"); } /// /// Удаление из памяти + сохранение в истории последнего состояния /// public void Dispose() { GameHistory.Instance.History.Push(SaveState()); } } /// /// Memento - Хранитель состояния /// class HeroMemento { public int Patrons { get; private set; } public HeroMemento(int patrons) { Patrons = patrons; } } /// /// Caretaker - смотритель состояния /// class GameHistory { private static GameHistory instance; public Stack History { get; set; } private GameHistory() { History = new Stack(); } public static GameHistory Instance { get { if(instance == null) instance = new GameHistory(); return instance; } } public void Clear() { History.Clear(); } }