2014-11-03 2 views
3

저는 최근에 서비스 관리자가 월드 매니저 (엔티티를 생성하고 추적 할 수있는)와 사운드 관리자와 같이 중요한 게임에 대한 중요한 관리자에게 액세스 할 수있는 좋은 디자인 패턴이 될 것이라고 결정했습니다. 그러나 서비스 로케이터에 액세스하는 가장 적합한 방법은 확실하지 않습니다. 필자는 main에 인스턴스화 된 서비스 로케이터에 포인터를 전달하는 것으로 시작했으나, 모든 것이 (발사체, 플레이어, 모든 것!) 인수에서 필요하다는 것을 알았 기 때문에 지루 해지고 있습니다.서비스 로케이터를 필요에 따라 모든 개체에 전달해야합니까?

나는 게임과 관련이 있다고 생각하지 않기 때문에 여기에 묻습니다.하지만 내가 잘못하면 그냥 알려주세요.

내가이 패턴을 잘못된 방식으로 사용하고 있습니까? 시간 내 주셔서 감사합니다.

편집 : 싱글턴이이 문제를 해결할 수 있습니까? 글로벌 액세스 포인트가 있지만 가장 깨끗한 솔루션이라고 생각하지 않습니다. 어떤 아이디어? 아니면 그게 최고일까요?

답변

1

전역 변수 (또는 싱글 톤)를 사용하는 것이 적절할 수 있습니다. 거의 모든 곳에서 참조를 전달할 필요가 없으므로 전역 변수/싱글 톤을 사용하는 단점을 고려해야합니다. 단점이 디자인/코드에 영향을 미치지 않는다고 생각되면 전역 변수를 사용하면 코드를 훨씬 명확하게 만들 수 있습니다. 전역 변수를 사용

일부 단점은 다음과 같습니다

  • 는 글로벌 될 수 있습니다 더 어려워의 수명을 관리. 서로 다른 변환 단위 (cpp 파일)에 여러 전역 변수를 정의하면 인스턴스화되는 순서가 지정되지 않으므로 인스턴스화 중에 서로 의존하지 않는 것이 좋습니다. 한 가지 해결책은 전역 포인터를 저장하고 프로그램의 초기 (예 : 메인)에 개체를 인스턴스화하는 것입니다. 그러나 프로그램의 파기 단계에서 매달리지 포인터를 만들지 않도록해야합니다.
  • 다중 스레드 컨텍스트에서 전역 변수에 대한 액세스를 동기화해야 할 수도 있습니다. 전역 변수를 사용하면 액세스를 동기화 할 필요가 없도록 스레드 별 객체 (또는 프록시)를 사용하는 것이 더 어렵습니다. 싱글의

추가 단점이 될 수 있습니다

  • 는 클래스, 예를 들어,의 사본을 만들 수없는 저장하거나 실행 취소합니다.
+0

정보를 제공해 주셔서 감사합니다. 이 두 가지 옵션에 대한 대안이 있습니까? 감사합니다 :) – 5Mixer

+0

@ Mixerman123 어디서나 저장 개체에 액세스 할 필요가없는 것과 같은 재 설계? –

+0

@D Drmmr 오디오 로깅과 엔티티 관리와 같이 매우 별개의 것들에 대한 액세스가 필요한 경우 어떻게해야합니까? 당신은 해결책이 있다면, 나는보고 싶습니다! – 5Mixer

0

개인적으로 싱글 톤을 사용하는 대신 컨텍스트 개체를 사용하는 것이 좋습니다. 문맥 객체는 포인터/참조 또는 모든 다른 서비스, 관리자 등에 대한 액세스를 제공하는 함수를 제공합니다.

+0

예, 서비스 위치 표시 자입니다. 내가 물어 보는 것은 내가 그 객체에 어떻게 접근 할 수 있는가하는 것이다. 정적 메소드를 가져야합니까? 그렇다면 어떻게? – 5Mixer

관련 문제