답변:
완전하지 않은 목록이지만 여기에 간다.
우리는 핸드 헬드 타이틀에서 "글로벌 싱글 톤의 구조체"를 많이 사용합니다. PC와 콘솔 타이틀은 덜 의존하는 경향이 있습니다. 우리는 이벤트 중심 / 메시징 아키텍처로 더 전환 할 것입니다. PC / 콘솔 타이틀은 여전히 중앙 TextureManager를 사용합니다. 일반적으로 단일 공유 리소스 (텍스처 메모리)를 래핑하기 때문에 이것은 우리에게 의미가 있습니다.
API를 비교적 깨끗하게 유지하면 필요할 때 싱글 톤 패턴에서 리팩토링 (또는 리팩토링)하기가 너무 어렵지 않을 수 있습니다 ...
싱글 톤 디자인 자체는 전혀 유용하지 않다고 말하고 싶습니다. 전역 변수는 분명히 유용 할 수 있지만 잘 작성된 인터페이스 뒤에 숨겨져있어 자신의 존재를 알지 못합니다. 싱글 톤을 사용하면 자신의 존재를 확실하게 알 수 있습니다.
나는 종종 엔진 전체를 통해 액세스가 필요한 것들에 전역 변수를 사용합니다. 내 퍼포먼스 툴은 엔진 전체에서 호출하는 좋은 예입니다. 전화는 간단합니다. ProbeRegister (), ProbeHit () 및 ProbeScoped (). 그들의 실제 접근은 조금 더 까다 롭고 일부에 전역 변수를 사용합니다.
글로벌의 주요 문제, 잘못 구현 된 싱글 톤은 모호한 구성 및 해체 버그입니다.
따라서 이러한 문제가 없거나 포인터로 문제를 잘 알고있는 프리미티브로 작업하는 경우. 그러면 안전하게 사용할 수 있습니다.
지구본은 자신의 위치를 가지고 있으며, 고토 스와 동일하며 손을 떼지 말고 조심스럽게 사용해야합니다.
Google C ++ 스타일 가이드 에 좋은 설명이 있습니다.
"단일 인스턴스"수명 관리자를 사용하는 경우에도 싱글 톤 대신 사용자 지정 수명 관리 기능이있는 일종의 DI / IoC 컨테이너를 사용하는 것이 좋습니다. 그런 다음 테스트를 용이하게하기 위해 구현을 쉽게 교체 할 수 있습니다.
싱글 톤의 메모리 절약 기능을 원한다면 플라이급 디자인 패턴을 사용해보십시오.
http://en.wikipedia.org/wiki/Flyweight_pattern
위에서 언급 한 다중 스레드 문제에 대해서는 스레드간에 공유 될 수있는 리소스에 대한 잠금 메커니즘을 구현하는 것이 매우 간단합니다. http://en.wikipedia.org/wiki/Read/write_lock_pattern
싱글 톤은 초기 프로토 타입에 공유 상태를 저장하는 좋은 방법입니다.
그것들은 은색 총알이 아니며 몇 가지 문제가 있지만 특정 UI / 논리 상태에 매우 유용한 패턴입니다.
예를 들어 iOS에서는 [UIApplication sharedApplication]을 가져 오는 데 싱글 톤을 사용하고 cocos2d에서는 [CCNotifications sharedManager]와 같은 특정 객체에 대한 참조를 가져 오는 데 사용할 수 있으며 개인적으로는 보통 [Game sharedGame] 싱글 톤으로 시작할 수 있습니다. 다양한 구성 요소간에 공유되는 저장 상태.
와우, 나는 개인적으로 싱글 톤 패턴에 문제가 없었기 때문에 나에게 흥미 롭습니다. 현재 진행중인 프로젝트는 Nintendo DS의 C ++ 게임 엔진이며, 많은 하드웨어 액세스 유틸리티 (예 : VRAM Banks, Wifi, 두 개의 그래픽 엔진)를 단일 인스턴스로 구현하고 있습니다. 기본 라이브러리의 함수.
컨트롤러가 하나만 있지만 여러 모듈에서 처리하는 항목이있는 경우에만 해당됩니다.
예를 들어, 마우스 인터페이스. 또는 조이스틱 인터페이스. 또는 음악 플레이어. 또는 사운드 플레이어. 또는 화면. 또는 파일 저장 관리자.
지구본이 훨씬 빠릅니다! 따라서 게임과 같은 성능 집약적 응용 프로그램에 완벽하게 적합합니다.
싱글 톤은 더 나은 글로벌 IMO이므로 올바른 도구입니다.
드물게 사용하십시오!