Я читал разные мнения о единственном образце. Некоторые утверждают, что этого следует избегать любой ценой, а другие могут быть полезны в определенных ситуациях.
Одна из ситуаций, в которой я использую синглеты, - это когда мне нужна фабрика (скажем, объект f типа F) для создания объектов определенного класса А. Фабрика создается один раз с использованием некоторых параметров конфигурации, а затем используется каждый раз, когда объект тип A создается. Таким образом, каждая часть кода, которая хочет создать экземпляр A, извлекает синглтон f и создает новый экземпляр, например
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Так что общий мой сценарий таков, что
- Мне нужен только один экземпляр класса либо по причинам оптимизации (мне не нужны несколько объектов фабрики), либо для совместного использования общего состояния (например, фабрика знает, сколько экземпляров A она все еще может создать)
- Мне нужен способ получить доступ к этому экземпляру f из F в разных местах кода.
Я не заинтересован в обсуждении, является ли этот шаблон хорошим или плохим, но если предположить, что я хочу избежать использования синглтона, какой другой шаблон я могу использовать?
У меня были идеи (1) получить фабричный объект из реестра или (2) создать фабрику в какой-то момент во время запуска программы, а затем передать фабрику как параметр.
В решении (1) сам реестр является одноэлементным, поэтому я только что перенес проблему неиспользования одного экземпляра с завода на реестр.
В случае (2) мне нужен некоторый исходный источник (объект), из которого происходит фабричный объект, поэтому я боюсь, что я снова вернусь к другому синглтону (объекту, который предоставляет мой экземпляр фабрики). Следуя этой цепочке синглетонов, я могу свести проблему к одному синглтону (целому приложению), с помощью которого все другие синглтоны управляются прямо или косвенно.
Будет ли этот последний вариант (с использованием одного исходного синглтона, который создает все другие уникальные объекты и внедряет все другие синглтоны в нужных местах) приемлемым решением? Является ли это решением, которое неявно предлагается, когда кто-то советует не использовать синглтоны, или каковы другие решения, например, в примере, показанном выше?
РЕДАКТИРОВАТЬ
Поскольку я думаю, что суть моего вопроса была неправильно понята некоторыми, вот еще немного информации. Как объяснено, например, здесь , слово singleton может указывать (а) на класс с одним экземпляром объекта и (б) шаблон проектирования, используемый для создания и доступа к такому объекту.
Чтобы прояснить ситуацию, давайте используем термин уникальный объект для (а) и шаблон синглтона для (б). Итак, я знаю, что такое одноэлементный шаблон и внедрение зависимостей (кстати, в последнее время я интенсивно использую DI для удаления экземпляров одноэлементного шаблона из некоторого кода, над которым я работаю).
Моя точка зрения заключается в том, что, если весь объектный граф не будет создан из одного объекта, находящегося в стеке основного метода, всегда будет необходимость доступа к некоторым уникальным объектам через шаблон синглтона.
Мой вопрос заключается в том, является ли единственное решение, не связанное с одноэлементным шаблоном, от того, зависит ли полное создание графов объектов и связывание от основного метода (например, с помощью некоторой мощной структуры DI, которая не использует сам шаблон) .