2013-05-25 2 views
0

У меня есть менеджер, как менеджер ресурсов, который является singleton. Некоторым объектам необходимо вызвать метод этого менеджера. Означает ли эта практика запах постели?Singleton злоупотребляет?

some object logic: ResourceManager::init()->callMethod(); 

Мы не используем ссылку на синглтон, мы получаем его во время выполнения. Это подходит?

+0

Почему, по вашему мнению, это злоупотребление классом singleton? Шаблон singleton ограничивает экземпляр класса одним объектом, что полезно, когда необходим один объект для координации действий по всей системе. Он не вводит никаких ограничений на вызов своих методов. –

+0

спасибо за ответ –

+5

Вызов его 'init' 'плохо пахнет (только первый вызов будет инициализирован, поэтому имя очень вводит в заблуждение, что-то вроде' getInstance() 'было бы более уместным). Но в противном случае это выглядит довольно стандартным способом использования singleton. – Dukeling

ответ

1

У шаблона Singleton есть свои плюсы и минусы, но если вы его используете, то то, что вы написали, не слишком страшное.

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

Насколько ваше использование касается, единственным реальным отрицательным в письменной форме

a::getInstance()->foo(); 
a::getInstance()->bar(); 

вместо

a* thing = a::getInstance(); 
thing->foo(); 
thing->bar(); 

будет потенциал накладных дополнительный вызов функции, если функция деЫпзЬапсе() не имеет были включены.

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

+0

Я понял, спасибо –

0

Здоровый способ использовать синглтон довольно прост:

класс ResourceManager {...}; // реализовать класс как нормальный

ResourceManager & GetResMan() {...} // глобальная точка доступа, вызов и Retuns экземпляр, который может быть локальным статическим, статичный на имя файла рамки, или даже могут использовать дополнительные трюки создания для угловых случаев

Документ это как вещь, предоставляющая однотонный сигнал.

GetResMan(). DoStuff(); // использование на клиентском сайте

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

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