Понимание различий: Singleton, Transient и Scoped в программировании

Когда дело доходит до разработки программного обеспечения, существуют различные способы управления экземплярами объектов, и три наиболее часто используемых метода — одноэлементный, временный и ограниченный. В этой статье мы углубимся в эти концепции, объясним их различия и предоставим примеры кода, которые помогут вам понять, когда и как использовать каждый подход. Итак, начнем!

Singleton: один экземпляр для управления всеми
Шаблон Singleton гарантирует, что только один экземпляр класса создается и используется во всем приложении. Это полезно, когда вам нужно поддерживать единое глобальное состояние или когда вы хотите ограничить потребление ресурсов.

Вот пример на Python:

class Singleton:
    _instance = None
    def __new__(cls, *args, kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls, *args, kwargs)
        return cls._instance

В приведенном выше коде метод __new__переопределен для управления созданием экземпляров. При первом вызове Singleton()создается новый экземпляр, который присваивается переменной _instance. При последующих вызовах возвращается тот же экземпляр.

Переходный: новые экземпляры каждый раз
В отличие от шаблона Singleton, переходный подход создает новый экземпляр класса каждый раз, когда он запрашивается. Это полезно, если вы хотите, чтобы каждый объект имел свое независимое состояние.

Давайте рассмотрим пример на C#:

public class TransientClass
{
    private readonly Guid _id;
    public TransientClass()
    {
        _id = Guid.NewGuid();
    }
    public Guid GetId()
    {
        return _id;
    }
}

В приведенном выше коде каждый раз при вызове new TransientClass()создается новый экземпляр с присвоенным ему уникальным _id.

Область действия: экземпляры в пределах определенной области
Время существования области действия создает экземпляр класса для каждой области. Область действия можно рассматривать как логическую границу, например веб-запрос или единицу работы в транзакции базы данных. Объекты с заданным временем жизни используются в одной области, но не в разных областях.

Давайте рассмотрим пример на C# с использованием ASP.NET Core:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<ScopedClass>();
}

В приведенном выше коде AddScopedиспользуется для регистрации ScopedClassс ограниченным сроком действия. Экземпляр ScopedClassбудет создан по запросу в заданной области и будет доступен в этой области.

Понимание различий между одноэлементными, временными и ограниченными объектами имеет решающее значение для правильного управления экземплярами объектов при разработке программного обеспечения. Синглтоны предоставляют глобальный экземпляр, переходные процессы каждый раз создают новые экземпляры, а экземпляры с ограниченной областью действия ограничены определенной областью действия. Используя соответствующий метод, вы можете обеспечить эффективное использование памяти и поддерживать желаемое состояние объекта.