Даблтон в C ++ - PullRequest
       28

Даблтон в C ++

3 голосов
/ 15 июня 2010

Мне известен шаблон синглтона в C ++, но как получить два экземпляра объекта?Есть ли такой шаблон, где мы могли бы легко получить два объекта?

Логика, о которой я мог подумать, состоит в том, что я могу изменить сам шаблон синглтона, чтобы два объекта были созданы внутри класса.Это работает, но если требование растет так, как если бы мне нужно 3 или только 4 объекта, какой шаблон проектирования будет соответствовать такому требованию?

Ответы [ 9 ]

9 голосов
/ 15 июня 2010

В разработке программного обеспечения есть принцип, что «есть только три числа: 0, 1 и бесконечность», что означает, что произвольные ограничения плохие. Иногда есть веские причины иметь только один ресурс (например, файл журнала). Как только у вас будет более одного, любой произвольный лимит в конечном итоге станет проблемой. Поэтому, если вам нужно более одного ресурса или объекта, вам понадобится пул, который может содержать произвольное число. Вам также нужен какой-то способ выбрать, какой ресурс раздавать из пула.

7 голосов
/ 15 июня 2010

Мне было бы тяжело, если бы вы действительно могли придумать убедительные варианты использования для этого паттерна.Общее согласие уже смещается к синглетам в качестве антипаттерна именно по тем причинам, которые вы уже упомянули: трудно обобщить его на большее количество экземпляров, и он не отличается от глобальных переменных (мы уже установили это как антипаттерн, верно?)

Возможно, вам следует продумать свой дизайн или придумать убедительный пример для этого.

6 голосов
/ 15 июня 2010
class myclass {...};

myclass obj1;
myclass obj2;

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

Просто создайте два экземпляра, если вам нужно два.

1 голос
/ 15 июня 2010

Почему бы вам не создать два синглета?;)

1 голос
/ 15 июня 2010

Существуют особые преимущества, когда существует только один объект. Только для одного примера, даже в многопоточной среде, если вы можете гарантировать, что есть только один объект, который имеет доступ к некоторым данным (то есть частным данным этого класса), тогда вы можете изменять данные без использования мьютекса / критического раздел / что угодно. Как только вы разрешаете более одного объекта (независимо от того, какое другое число вы выбираете), вы теряете фундаментальное качество, которое делает интересным синглтон.

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

Если вам не нужно поддерживать многопоточность, достаточно простого счетчика.

1 голос
/ 15 июня 2010

Это больше похоже на необходимость создания пула объектов, попыток отойти от глобальных объектов.

0 голосов
/ 15 июня 2010

Если вам нужно несколько экземпляров одного и того же объекта, вы можете использовать пул объектов.

Если вам нужна карта множества объектов Singleton, вы можете использовать шаблон Multiton.

0 голосов
/ 15 июня 2010

Почему бы не использовать массив (если размер будет статичным) или List (если размер не будет статичным)?

Я согласен с мнением 0, 1,или бесконечность;однако, с точки зрения чистой реализации, это идеальный вариант использования массивов.Вы даже можете создать оболочку для своего массива, чтобы потребители не знали, что вы используете массив.Я вижу использование этого в сценарии с очередями или пулами.

0 голосов
/ 15 июня 2010

Шаблон проектирования Singleton создает - по определению в книге GoF - объект только с одним экземпляром.Примером может служить синглтон, представляющий системные часы;в этом случае несколько объектов, каждый из которых представляет часы, не имеет смысла.

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

Возможно, взгляните на «Современный дизайн C ++» Александреску - в нем есть отличная глава по Singletons.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...