싱글 톤 패턴에 대한 다른 의견을 읽었습니다. 어떤 사람들은 모든 비용으로 피해야하고 어떤 상황에서는 유용 할 수 있다고 유지합니다.
단일 클래스를 사용하는 한 가지 상황은 특정 클래스 A의 객체를 만들기 위해 팩토리 (F 유형의 객체 f라고 가정 함)가 필요한 경우입니다. 팩토리는 일부 구성 매개 변수를 사용하여 한 번 생성 된 다음 객체가 생성 될 때마다 사용됩니다 유형 A가 인스턴스화됩니다. 따라서 A를 인스턴스화하려는 코드의 모든 부분이 싱글 톤 f를 가져오고 새 인스턴스를 만듭니다.
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
그래서 일반적인 시나리오는
- 최적화 이유 (여러 팩토리 객체가 필요하지 않음) 또는 공통 상태 공유를 위해 클래스의 인스턴스가 하나만 필요합니다 (예 : 팩토리는 여전히 A 인스턴스를 얼마나 만들 수 있는지 알고 있습니다)
- 코드의 다른 곳에서 F의 F 인스턴스에 액세스 할 수있는 방법이 필요합니다.
내가 관심이없는 이 패턴이 좋은지 나쁜지 여부를 해당 항목에서 설명합니다,하지만 난 싱글 톤을 사용하지 않도록 할 가정, 어떤 다른 패턴 내가 사용할 수 있습니까?
내가 가진 아이디어는 (1) 레지스트리에서 팩토리 객체를 가져 오거나 (2) 프로그램 시작 중 어느 시점에서 팩토리를 만든 다음 팩토리를 매개 변수로 전달하는 것이 었습니다.
솔루션 (1)에서 레지스트리 자체는 싱글 톤이므로 공장에서 레지스트리로 싱글 톤을 사용하지 않는 문제를 방금 변경했습니다.
경우 (2) 공장 객체가 제공되는 초기 소스 (객체)가 필요하므로 다른 싱글 톤 (공장 인스턴스를 제공하는 객체)으로 다시 넘어 갈까 두렵습니다. 이 싱글 톤 체인을 따라 가면 다른 싱글 톤 을 직접 또는 간접적으로 관리 하는 단일 싱글 톤 (전체 응용 프로그램)으로 문제를 줄일 수 있습니다 .
이 마지막 옵션 (다른 모든 고유 한 객체를 생성하고 올바른 장소에 다른 모든 싱글 톤을 주입하는 하나의 초기 싱글 톤 사용)이 수용 가능한 솔루션입니까? 이것이 싱글 톤을 사용하지 말 것을 권고 할 때 암시 적으로 제안되는 솔루션입니까, 아니면 예를 들어 위에서 설명한 예에서 다른 솔루션은 무엇입니까?
편집하다
내 질문의 요점을 일부 사람들이 오해했다고 생각하기 때문에 여기에 더 많은 정보가 있습니다. 여기 에서 설명 된 바와 같이 , 싱글 톤 이라는 단어 는 (a) 단일 인스턴스 객체를 갖는 클래스 및 (b) 그러한 객체를 생성하고 액세스하는데 사용되는 디자인 패턴을 나타낼 수있다.
보다 명확하게하기 위해 (a)에 고유 한 객체 라는 용어를 사용하고 (b)에 싱글 톤 패턴 을 사용하겠습니다 . 그래서, 싱글 톤 패턴과 의존성 주입이 무엇인지 알고 있습니다 (BTW, 요즘 DI를 사용하여 일부 코드에서 싱글 톤 패턴의 인스턴스를 제거했습니다).
내 요점은 전체 객체 그래프가 main 메소드의 스택에있는 단일 객체에서 인스턴스화되지 않는 한 항상 싱글 톤 패턴을 통해 일부 고유 객체에 액세스해야한다는 것입니다.
내 질문은 완전한 객체 그래프 생성 및 배선이 주요 방법에 의존하는지 (예 : 패턴 자체를 사용하지 않는 강력한 DI 프레임 워크를 통해) 유일한 싱글 톤 패턴 프리 솔루션인지 여부입니다.