2016-12-11 2 views
2

고유 ID를 할당 할 수있는 리소스 관리자를 쓰고 있습니다 (예 : OpenGL 유니폼 버퍼 바인딩 포인트에 대해 사용 된 리소스를 추적 할 필요가 없음). 매니저의 인스턴스가 많을수록 각 ID가 이미 사용되었음을 알아야하기 때문에 문제가됩니다. 그래서 한 가지 방법은 사용하는 싱글 톤 :싱글 톤 대 정적 멤버

class ResourceManager 
{ 
private: 
    HandleAllocator uniform_binding_points; 
    ... 
public: 
    static ResourceManager& Get() 
    { 
     static ResourceManager resource_manager; 
     return resource_manager; 
    } 
    unsigned int AllocateUniformBindingPoint() 
    { ... } 
    ... 
private: 
    ResourceManager() 
    { } 
    ~ResourceManager() 
    { } 
} 

또는 정적 멤버를 사용하는, 그래서 더 인스턴스가있을 수 있지만, 각 인스턴스는 동일한 상태 사용 :

class ResourceManager 
{ 
private: 
    static HandleAllocator uniform_binding_points; 
    ... 
public: 
    unsigned int AllocateUniformBindingPoint() 
    { ... } 
    ... 
} 

그래서 내 질문입니다 차이점은 무엇이며 더 나은 솔루션이 있다면 (테스트 가능성도 고려한)? 나는 많은 사람들이 싱글 톤을 싫어한다는 것을 알고 있지만 제 생각에는 유일한 차이점은 싱글 메소드 인스턴스 인 Get()을 더 많이 호출해야한다는 것입니다. 그러나 Get() 메소드를 한 번 호출하면 참조를 저장할 수 있습니다. 또한 나는 이것을 읽었습니다 : http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/ 그리고 구성 및 집계를 통해 똑같은 "의존성 숨김"을 달성 할 수 있다고 말할 필요가 있습니다. 따라서 이들도 사용하지 마십시오 ...

+1

더 이상 단일 인스턴스는 없지만 더 많은 인스턴스가 필요하기 때문에 아키텍처를 리팩토링해야하는 경우 문제가 발생합니다. –

답변

2

이 스타일이라고 생각합니다. 문제가 있으므로 확실한 답이 없습니다. 그러나 여기에 싱글 톤이 더 나은 해결책이라고 생각되는 몇 가지 이유가 있습니다.

Get 메서드 (보통은 instance이라고 함)는 이것이 적어도 싱글 톤임을 명시합니다 (적어도 자신의 문서를 읽은 사람은 문서에서 싱글 톤이라고 말합니다).

auto &mgr = ResourceManager::Get(); 

으로 초기화 된 여러 참조가있을 수 있습니다. 그러나 모두 동일합니다. 이 인스턴스에 대한 함수 호출은 모두 동일한 객체에 대한 호출임을 명확히합니다. 따라서 일반적인 가이드 라인을 쉽게 따라갈 수 있습니다. 예를 들어 응용 프로그램이 멀티 스레딩을 인식하는 경우 일반적으로 동일한 객체에서 동시에 변경할 수있는 메서드를 호출하면 안됩니다 (단, ResourceManager의 구현은 해당 지침을 따름). 나는 사용자와 그 구현 방법을 알고 아니에요 경우 이제

ResourceManager mgr1; 
ResourceManager mgr2; 

를 정적 멤버 접근 방식을 고려, 내가하지 않은이 두 객체 각각에 두 개의 가변 메소드를 호출에 어떤 해를 볼 수 없습니다 참된. 한마디로 Singleton이 무엇인지 이해하는 사용자라면 Singleton을 좀 더 "자체 문서화"한다고 생각할 수 있습니다.

또한 싱글 톤의 복사 할 수없는 속성은 컴파일 타임에 의도하지 않은 사용을 쉽게 감지 할 수있게합니다.

마지막으로 중요한 점은 싱글 톤이 장수 관리의 유연성을 더 많이 부여한다는 것입니다. 귀하의 예에서는 Meyer의 싱글 톤이 사용되므로 큰 차이가 없습니다. 하지만 필요가 생기면 싱글 톤 구현을 변경하여 수명을 미세 조정할 수 있습니다.