2013-05-25 3 views
0

나는 싱글 톤이되는 자원 관리자와 같은 관리자가 있습니다. 일부 객체는이 관리자의 메소드를 호출해야합니다. 이 연습이 침대 냄새가 나니?싱글 톤 남용?

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

우리는 싱글 톤에 대한 참조를 사용하지 않고 있습니다. 런타임 중에 가져옵니다. 적합한가요?

+0

왜 이것이 싱글 톤 클래스를 악용한다고 생각하십니까? 싱글 톤 패턴은 클래스의 인스턴스화를 하나의 객체로 제한합니다. 이는 시스템 전체에서 작업을 조정하는 데 정확히 하나의 객체가 필요할 때 유용합니다. 메소드를 호출 할 때 어떤 제한도 두지 않습니다. –

+0

답변을 주셔서 감사합니다 –

+5

'init'을 '냄새가 좋지 않습니다'라고 부르면 (첫 번째 호출 만 초기화되므로 이름이 잘못되어 'getInstance()'와 같은 것이 더 적절할 수 있습니다). 하지만 그렇지 않으면 이것은 싱글 톤을 사용하는 꽤 표준적인 방법처럼 보인다. – Dukeling

답변

1

싱글 톤 패턴에는 장점과 단점이 있지만, 사용하는 경우 작성한 내용이 너무 심각하지 않습니다.

하지만 init()의 이름을 getInstance()와 같은 것으로 변경하는 것이 좋습니다.

의 getInstance() 함수를하지 않은 경우 지금까지 귀하의 사용에 관한 한,

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

대신

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

쓰기의 유일한 부정적인 잠재적 인 추가 함수 호출 오버 헤드가 될 것이다 인라인되었다.

일반적으로 단일 함수 내에서 동일한 싱글 톤을 여러 번 사용하려는 경우 getInstance()를 한 번 호출하면 훨씬 좋지만 궁극적으로는 코딩 스타일 문제가 더 많을 것이라고 생각합니다. 실제 성능 문제.

+0

알았어, 고마워. –

0

싱글 톤을 사용하는 건강한 방법은 아주 간단합니다 :

클래스는 ResourceManager {...}; 인스턴스 retuns 소환 및 // 정상

ResourceManager에 & GetResMan (같은 클래스를 구현) {...} // 글로벌 액세스 포인트, 즉, 로컬 정적 파일명 범위에서 정적 또는 심지어 수있다 코너 케이스 싱글을 제공하는 것으로서

문서를 추가로 생성 트릭을 사용할 수 있습니다.

GetResMan(). DoStuff(); 당신이 긍정적 인 경우 안전하게 비난을 무시할 수 - 그것이 좋은지 나쁜지 여부를 여기에서 클라이언트 사이트

에서 가 // 사용은 당신이 실제로 해당 관리자에 대한 싱글을 의미하는지 여부 애플리케이션 로직/디자인에 따라 달라집니다 캠페인.

정제 된 버전에는 두 가지 액세스 기능이있을 수 있습니다. 주류는 const ref를 반환하기 때문에 나머지 클라이언트는 변경 클라이언트 호출을 쉽게 알 수 있습니다. 그러나 클래스의 특성과 사용 사례에 따라 다릅니다.