2017-02-09 16 views
1

Я разрабатываю класс для управления сетевым адаптером, и мне нужно убедиться, что есть только один экземпляр этого класса. Глобальный доступ не требуется, так как этот класс используется только клиентами, выполняющими сетевые операции, поэтому я думаю, что это не относится к шаблону singleton.Лучший способ обеспечить единый экземпляр, но не глобальный в C++

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

Каков наилучший способ сделать это и избежать проблем с тестируемостью?

EDIT: У меня есть несколько адаптеров (wifi, ethernet, 2G/3G/4G), но у меня может быть только один экземпляр каждого.

+5

проблемы XY? Почему вас волнует, сколько экземпляров класса существует? – SergeyA

+1

[Singletons] (https://en.wikipedia.org/wiki/Singleton_pattern) хороши для этого. – Isuka

+3

@ Исука, синглтоны хороши ни для чего. – SergeyA

ответ

3

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

... так что я думаю, что это не тот случай, когда одноэлементный шаблон.

Ограничение класса одним экземпляром - это определение одноэлементного шаблона.

Каков наилучший способ сделать это и избежать проблем с тестируемостью?

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

Глобальный доступ не является необходимым

Тогда я предлагаю локальную статическую переменную:

void function_that_needs_a_single_instance_ever() { 
    static singleton_class instance; 
    // do something with your singleton 
} 
+0

У статического локального компьютера также возникает ряд проблем. В средах Microsoft они не могут быть безопасно инициализированы в потоковой среде, даже с C++ 11. У нас есть два отчета об ошибках, открытых из-за игр Microsoft. – jww

+0

@jww спасибо за головы. Я не знал об этом конкретном несоответствии стандартам. – user2079303