Класс Singleton против класса со статическим членом

Несмотря на множество тем в этой теме, я до сих пор неясно, когда выбирать, какой подход. Я надеюсь, что, обсудив конкретный пример, я, наконец, "получу".

Примечание. Мой язык здесь Cocoa, хотя общая проблема не зависит от языка.

У меня есть класс TaskQueue, который я хочу использовать для:

  • доступ из любого места в моем коде для добавления или удаления запланированных задач
  • автоматически выполняет запланированные задания с регулярными интервалами.

Когда TaskQueue впервые используется, я хочу, чтобы TaskQueue инициировал поток, который затем просыпался с регулярными интервалами для обработки задач.

Очевидно, мне понадобится минимум две переменные:

  • массив для хранения задач
  • экземпляр потока, обрабатывающего задачи

Поскольку для обработки этих задач требуется только одна очередь задач и один поток, у меня есть два варианта:

Существует ли один подход, который лучше, чем другой в этом конкретном случае? Если да, то почему?

Ответы

Ответ 1

Основные отличия - это простые вещи, такие как:

  • с помощью singleton вы можете обойти объект для делегатов и обратных вызовов
  • с помощью singleton вы можете реализовать интерфейсы и получить его
  • с помощью singleton вы можете использовать шаблон factory для создания своего экземпляра

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

Я лично предпочитаю использовать статические методы, если у меня нет явной причины использовать экземпляр singleton (например, имеющий общий интерфейс, но различные реализации).

Помните тот факт, что рефакторинг статических методов для одноэлементного экземпляра - довольно простой процесс, поэтому, если вы когда-либо найдете необходимость в последнем, вы легко его реорганизуете (тогда у вас есть препроцессор C, один #define будет почти достаточно).