Подтвердить что ты не робот

Зачем использовать singleton вместо статического класса?

Когда одноэлемент на самом деле будет проще или лучше статического класса? Мне кажется, что создание синглтона - это просто дополнительные усилия, которые на самом деле не нужны, но я уверен, что есть веская причина. В противном случае они не будут использоваться, очевидно.

4b9b3361

Ответ 1

Одна из хороших причин для предпочтения одиночного элемента над статическим классом (при условии, что у вас нет лучших шаблонов в вашем распоряжении;)), заменяет один экземпляр singleton другим.

Например, если у меня есть такой журнал:

public static class Logger {
    public static void Log(string s) { ... }
}

public class Client {
    public void DoSomething() {
        Logger.Log("DoSomething called");
    }
}

Это работает очень хорошо, но что, если Logger записывает вещи в базу данных или записывает выходные данные на консоль. Если вы пишете тесты, вам, вероятно, не нужны все эти побочные эффекты, но поскольку метод журнала статичен, вы ничего не можете сделать, кроме.

Хорошо, поэтому я хочу, чтобы мой метод Log для горячей замены. Go go gadget singleton!

public class Logger {
    private static Logger _instance;
    public static Logger Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Logger();
            return _instance;
        }
        set { _instance = value; }
    }
    protected Logger() { }
    public virtual void Log(string s) { ... }
}

public class Client {
    public void DoSomething() {
        Logger.Instance.Log("DoSomething called");
    }
}

Итак, вы можете определить TestLogger : Logger с помощью пустого метода Log, а затем установить экземпляр вашего тестового журнала для экземпляра singleton для тестов. Presto! Вы можете отключить реализацию вашего регистратора для тестирования или производства, не затрагивая код клиента.

Ответ 2

Синглтоны часто предпочитают глобальные переменные, потому что:

  • Они не загрязняют глобальное пространство имен (или в языках с пространствами имен, их пространство имен) с ненужными переменными.
  • Они допускают ленивое выделение и инициализацию, тогда как глобальные переменные на многих языках всегда будут потреблять ресурсы.

Источник

EDIT:

Однократное использование синглтона в сочетании с методом factory может быть использовано для создания Flyweight pattern. Это когда вы создаете новый объект, factory (вместо создания нового объекта) сначала проверяет, чтобы синглтон этого объекта уже был сделан, если он есть, он просто возвращает этот объект, если нет, он создает новый синглтон и возвращает его, следя за создаваемыми синглтонами. Flyweights работают из-за неизменности синглтона.

Ответ 3

Синглтоны всегда казались немного лишними для меня. Я предпочитаю статические классы, и если мне нужно другое поведение, я совмещаю его с инъекцией зависимостей и провайдером. Я не знаю, что это за шаблон, или если у него есть имя, но обычно это выглядит примерно так:/p >

public interface IFooProvider {
  Bar FooBar();
}

public static class Foo {
  public static readonly IFooProvider FooProvider { get; set; }
  public Bar FooBar() { return FooProvider.FooBar(); }
}

Затем я просто хочу установить поставщика где-нибудь в моем методе init. Достаточно легко добавить ленивую инициализацию, если хотите, установив поставщика по умолчанию при инициализации класса. Лучше всего, это позволяет вам изменять поведение, сохраняя при этом эстетику использования статических классов.

Ответ 5

Несмотря на то, что IMHO шаблон singleton является довольно злоупотребляющим шаблоном, он иногда предлагает преимущества, такие как:

  • Возможность использовать различные объекты (которые наследуются от одной базы) в качестве экземпляра (например, поставщики данных, в которых вы используете файловую систему, и одну базу данных SQL).
  • Сериализуемость. Я не использовал фреймворк, который может автоматически сериализовать статические классы.
  • Использование менее статических полей. Для некоторых людей это скорее эстетическая особенность, но в некоторых случаях она имеет практические преимущества.

Ответ 6

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

Кроме того, вы можете использовать singleletons с интерфейсами, как и любой другой класс.