C#20 марта
Шаблон проектирования Singleton (Одиночка) используется в объектно-ориентированном программировании для ограничения создания экземпляров класса до единственного объекта.
Этот шаблон гарантирует, что только один экземпляр класса будет создан и предоставляет глобальную точку доступа к этому экземпляру.
Реализация шаблона Singleton в C# включает в себя создание приватного конструктора и статического метода, который возвращает единственный экземпляр класса. Обычно, этот метод имеет имя GetInstance() или Instance().
Пример реализации паттерна Singleton в C#:
В данном примере класс Singleton имеет приватный конструктор, что означает, что создание объекта класса возможно только изнутри класса.
В классе также объявляется статическая переменная instance, которая хранит ссылку на единственный экземпляр класса.
Метод Instance реализует ленивую инициализацию (lazy initialization), что означает, что экземпляр класса создается только при первом обращении к методу Instance.
Для того чтобы предотвратить создание двух экземпляров класса в многопоточной среде, используется объект lock для синхронизации доступа к методу Instance.
Использование паттерна Singleton позволяет уменьшить количество создаваемых объектов и сэкономить память, что особенно важно при работе с большими и сложными объектами.
Однако, следует помнить, что слишком частое использование паттерна Singleton может привести к усложнению кода и затруднению его тестирования.
Просто реализовать Одиночку несложно — достаточно скрыть конструктор и предоставить статический создающий метод.
Тот же класс ведёт себя неправильно в многопоточной среде. Несколько потоков могут одновременно вызвать метод получения Одиночки и создать сразу несколько экземпляров объекта.
using System;
namespace RefactoringGuru.DesignPatterns.Singleton.Conceptual.NonThreadSafe
{
// Класс Одиночка предоставляет метод `GetInstance`, который ведёт себя как
// альтернативный конструктор и позволяет клиентам получать один и тот же
// экземпляр класса при каждом вызове.
// EN : The Singleton should always be a 'sealed' class to prevent class
// inheritance through external classes and also through nested classes.
public sealed class Singleton
{
// Конструктор Одиночки всегда должен быть скрытым, чтобы предотвратить
// создание объекта через оператор new.
private Singleton() { }
// Объект одиночки храниться в статичном поле класса. Существует
// несколько способов инициализировать это поле, и все они имеют разные
// достоинства и недостатки. В этом примере мы рассмотрим простейший из
// них, недостатком которого является полная неспособность правильно
// работать в многопоточной среде.
private static Singleton _instance;
// Это статический метод, управляющий доступом к экземпляру одиночки.
// При первом запуске, он создаёт экземпляр одиночки и помещает его в
// статическое поле. При последующих запусках, он возвращает клиенту
// объект, хранящийся в статическом поле.
public static Singleton GetInstance()
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
// Наконец, любой одиночка должен содержать некоторую бизнес-логику,
// которая может быть выполнена на его экземпляре.
public void someBusinessLogic()
{
// ...
}
}
class Program
{
static void Main(string[] args)
{
// Клиентский код.
Singleton singleton1 = Singleton.GetInstance();
Singleton singleton2 = Singleton.GetInstance();
if (singleton1 == singleton2)
{MessageBox.Show($"Синглтон работает, обе переменные содержат один и тот же экземпляр");} else {MessageBox.Show($"Ошибка синглтона, переменные содержат разные экземпляры.");
} } } }
Этот класс Singleton реализует паттерн проектирования Singleton, который гарантирует, что в приложении будет только один экземпляр класса и предоставляет глобальную точку доступа к этому экземпляру.
Конструктор класса Singleton является закрытым (private), что означает, что экземпляр класса можно создать только изнутри самого класса. Таким образом, другие классы не смогут создать экземпляр этого класса с помощью оператора new.
Статическое поле _instance
хранит единственный экземпляр класса Singleton. Если поле _instance
равно null, то метод GetInstance()
создает новый экземпляр класса Singleton и присваивает его полю _instance
. В противном случае, если экземпляр класса уже создан, метод GetInstance()
просто возвращает существующий экземпляр.
Наконец, класс Singleton содержит метод someBusinessLogic()
, который содержит бизнес-логику, которая может быть выполнена на его экземпляре. Этот метод может быть вызван из любого места программы, которое имеет доступ к экземпляру класса Singleton.
Синглтон работает, обе переменные содержат один и тот же экземпляр.
Теги: #паттерн, #singleton, #c#
Ваш комментарий успешно добавлен.
После проверки комментарий будет опубликован на сайте.