Паттерны проектирования: Одиночка (Singleton)

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

 
    sealed class MySession
    {
        private static MySession _session;
        private readonly DateTime _date;
        private readonly Dictionary<string, string> _dictionary;

        private MySession()
        {
            _date = DateTime.Now;
            _dictionary = new Dictionary<string, string="">();
        }

        public static MySession Instance
        {
            get { return _session ?? (_session = new MySession()); }
        }

        public DateTime DateStart
        {
            get { return _date; }
        }
        public String this[String key]
        {
            get { return _dictionary.ContainsKey(key) ? _dictionary[key] : ""; }
            set
            {
                if (_dictionary.ContainsKey(key))
                {
                    _dictionary[key] = value;
                }
                else
                {
                    _dictionary.Add(key, value);
                }
            }
        }
    }

В данном классе конструктор MySession является защищенным, его нельзя вызвать вне данного класса. Доступ ко всем элементам класса происходит через статическое свойство Instance. При первом вызове происходит запись текущей даты, для возможности проверки даты начала работы с сессией. Также есть словарь, принимающий в качестве значения и ключа строку, словарь служит для записи/хранения необходимой информации. Проверим работу.

 
MySession.Instance["user"] = "Андрей";
MySession.Instance["role"] = "admin";

Console.WriteLine(MySession.Instance.DateStart);
Console.WriteLine(MySession.Instance["user"]);
Console.WriteLine(MySession.Instance["role"]);
Console.WriteLine(MySession.Instance.DateStart);
Console.WriteLine(MySession.Instance.DateStart);

Результат будет следующим.

Исходный код учебного проекта: https://github.com/flash2048/Patterns/tree/master/Singleton

Нужно помнить, что глобальные объекты могут быть вредны для объектного программирования!

Комментарии (2) -

При переходе по ссылке "Исходный код учебного проекта" выводится сообщение: "This link doesn't work anymore"

Андрей 07.10.2017 15:01:31

Ссылки на исходный код поправлены.

Добавить комментарий