В каких случаях одноэлементный шаблон проектирования может создавать несколько экземпляров одного и того же одноэлементного класса? - PullRequest
2 голосов
/ 09 февраля 2012

Это вопрос интервью.

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

Моя идея:

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

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

Есть идеи получше?

Ответы [ 7 ]

3 голосов
/ 09 февраля 2012

В C ++ 11 появилась новая возможность сделать надежной однократную инициализацию - std::call_once. Вы можете найти хорошую ссылку для этого здесь . Если вы работаете с компилятором, который поддерживает C ++ 11, это дает вам хороший, независимый от платформы, стандартный способ сделать это.

На уровне платформы зависит от того, что большинство операционных систем предоставляют возможность однократной инициализации. Например. в iOS или OS X вы можете использовать dispatch_once из Grand Central Dispatch . В Windows есть API одноразовой инициализации , доступный в Vista и более поздних версиях.

Это хорошо, когда у вас нет стандартной альтернативы, но благодаря C ++ 11 вам больше не нужно делать подобные вещи в зависимости от платформы. Идеально подходит для инициализации синглтона.

2 голосов
/ 09 февраля 2012

это может показаться очевидным, но если у вас есть несколько процессов, вы можете иметь многоолные одноэлементные экземпляры. Я в большей степени Java-парень, но если у вас есть что-то эквивалентное ClassLoader's, то вы снова можете иметь несколько синглетонов. В принципе, вы можете иметь столько синглетонов, сколько сущностей, управляющих реализацией (здесь речь идет о фабричном паттерне)

1 голос
/ 09 февраля 2012

в OS X, статические объекты в разных динамических библиотеках будут разными экземплярами. В Windows и Linux они будут вести себя как положено.

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


foo.h

static Foo* global_instance;

foo.cpp

static Foo* global_instance = new Foo();

вам нужно сделать это:


foo.h

Foo* get_global_instance();

foo.cpp

Foo* get_global_instance() {
     static Foo instance;
     return &instance;
    }
0 голосов
/ 09 февраля 2012

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

0 голосов
/ 09 февраля 2012

ОК, это возможно. На интерфейсе у вас есть синглтон ... но в реализации было выбрано несколько экземпляров по любой причине ... может быть, пул?

0 голосов
/ 09 февраля 2012

Проверьте также проблемы с двойной проверкой одноэлементной схемы блокировки.Выпуск рассмотрен в интернете много раз.Но ... 99% синглетов, которые я видел в своей жизни, используют этот шаблон:)

0 голосов
/ 09 февраля 2012

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

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