문제

아니면 다른 디자인 패턴을 사용하는 것이 낫습니까?

도움이 되었습니까?

해결책

며칠 전에 비슷한 질문에 응답했습니다 여기서 싱글 톤을 조롱합니다. 원래 게시물은 싱글 톤의 행동을 조롱하는 것과 관련하여 C#.net 용이지만 여전히 적용해야합니다.

싱글 톤 패턴과 관련하여 그 자체로는 아무런 문제가 없습니다. 많은 경우 논리와 데이터를 중앙 집중화하려고합니다. 그러나 싱글 톤과 정적 클래스 사이에는 매우 큰 차이가 있습니다. 응용 프로그램의 모든 소비자에게 구현하는 정적 클래스 하드 코드로서 싱글 톤을 구축하므로 장치 테스트가 매우 어려워집니다!

당신이하고 싶은 것은 싱글 톤의 인터페이스를 정의하여 소비자가 사용할 방법을 노출시키는 것입니다. 당신의 소비자는 차례로입니다 통과 누구의 구현 클래스에 대한 참조는 그들을 인스턴스화하는 사람이 누구인지 (일반적으로 응용 프로그램이거나, 의존성 주입에 익숙한 경우 컨트롤의 역전].

소비자를 인스턴스화하는 것은이 프레임 워크입니다. 정적 클래스에서 인터페이스 참조로의 도약은 [위의 링크에서 설명 된 것처럼] 전 세계적으로 접근 가능한 인스턴스의 편리함을 잃어버린 것은 아닙니다. 글로벌 참조는 몹시 매혹적이지만 루크는 그의 등을 어두운면, 당신도 할 수 있습니다!

일반적으로 모범 사례는 정적 참조를 피하고 인터페이스에 대한 progamming을 장려합니다. 이러한 제약 조건으로 싱글 톤 패턴을 적용 할 수 있습니다. 다음 지침을 따르면 작업을 테스트하는 데 문제가 없어야합니다. :)

도움이 되었기를 바랍니다!


싱글 톤! = 공개 정적 클래스, 꽤 싱글 톤 == 단일 인스턴스

다른 팁

테스트 가능성 부족은 클래식 싱글 톤 모델의 주요 몰락 중 하나입니다 (정적 클래스 메소드 인스턴스를 반환). 내가 염려하는 한, 그것은 싱글 톤을 사용하여 다른 디자인을 사용하는 코드를 다시 설계 할만 큼 충분히 정당화됩니다.

단일 인스턴스가 절대적으로 필요하다면 Johnny G가 제안한대로 의존성 주입 및 인터페이스에 쓰는 것이 확실히 갈 길입니다.

다음 패턴을 사용하고 있습니다 내가 조롱 할 수있는 정적 기반 싱글 톤을 쓸 때. 코드는 Java이지만 아이디어를 얻을 것이라고 생각합니다. 이 접근법의 주요 문제는 패키지로 보호 된 제작자 (진정한 싱글 톤을 물리칩니다)를 완화해야한다는 것입니다. 참고로 - 코드는 "정적"코드를 조롱하는 능력에 적용됩니다.

나는 일반적으로 플라이급 객체 또는 유사한 값 객체에 대한 싱글 톤 만 사용합니다. IOC 컨테이너를 살펴보면 (위에서 논의한 바와 같이) 아마도 싱글 톤보다 공유 객체를 처리하는 더 좋은 방법 일 것입니다.

SmallTalk (많은 패턴이 시작된 곳)에서는 True와 False가 효과적으로 단일 톤 이었다는 것을 고려하십시오 :)

싱글 톤을 사용해야한다면 (그리고 그렇게해야 할 이유가 있지만 가능하면 항상 피하려고 노력할 것입니다). IOC 컨테이너를 사용하여 관리하는 것이 좋습니다. 델파이를위한 것이 있는지 확실하지 않습니다. 그러나 Java에서는 Spring을 사용할 수 있습니다. .NET에서는 Windsor/Castle을 사용할 수 있습니다. IOC 컨테이너는 싱글 톤을 보유 할 수 있으며 테스트를 위해 다른 구현을 등록 할 수 있습니다.

이 스 니펫을 넘어서 여기에 들어가기에는 너무 큰 주제 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top