배경 : 스레드로부터 안전하게 만든 피사체/관찰자 디자인 패턴을 구현하는 클래스가 있습니다. subject
은 observers
이라는 알림을 알리는 메시지와 동일한 스레드에서 observer
이 생성 된 경우 간단한 메서드 호출 observer->Notified(this)
으로 알립니다. 그러나 observer
이 다른 스레드에서 생성 된 경우 queue
에 알림이 게시되어 나중에 observer
을 구성한 스레드에서 처리 된 다음 알림 이벤트가 처리 될 때 간단한 메서드 호출을 수행 할 수 있습니다.싱글 톤을 제거하는 데 도움이됩니다 : 대안을 찾으십시오
그래서 ... 스레드와 대기열이 생성되고 삭제 될 때 업데이트되는 스레드와 대기열을 매핑하는지도가 있습니다. 이 맵 자체는 뮤텍스를 사용하여 멀티 스레드 액세스를 보호합니다.
지도는 싱글 톤입니다.
나는 "이 응용 프로그램에 하나만있을 것"이기 때문에 과거에 싱글 톤 (singleton)을 사용한 것에 대해 유죄를 지켰으며, 저를 믿습니다 - 나는 내 보속을 지불했습니다!
응용 프로그램에서 실제로 대기열/스레드 맵이 하나만 존재할 것이라고 생각하는 한 부분은 도움이되지 않습니다. 다른 목소리는 싱글 톤이 좋지 않아서 그들을 피해야한다고 말합니다.
나는 싱글 톤을 제거하고 내 유닛 테스트를 위해 스텁 할 수 있다는 생각을 좋아합니다. 문제는 좋은 대안 솔루션을 생각하기가 힘듭니다.
과거에 성공한 "일반적인"솔루션은 단독 개체를 참조하는 대신 사용할 개체에 대한 포인터를 전달하는 것입니다. 관측자와 피사체는 내 응용 프로그램에서 10 페니이기 때문에이 경우 까다로울 것이라고 생각합니다. 대기열/스레드 맵 객체를 모든 단일 관찰자의 생성자로 전달해야하는 것은 매우 어색합니다.
감사합니다. 내 응용 프로그램에는지도가 하나 뿐이지 만 의사 결정 클래스가있는 곳에서는 관찰자 클래스 코드에 있지 않아야합니다.
어쩌면 이것은 유효한 싱글 톤이지만, 제거 방법에 대한 아이디어도 있습니다.
감사합니다.
추신. 수락 대답에 언급 된 What's Alternative to Singleton과 this article을 읽었습니다. 나는 ApplicationFactory가 다른 이름으로 또 하나의 싱글 톤이라고 생각하는 것을 도울 수 없다. 나는 정말로 이점을 보지 못한다.
왜 싱글 톤을 피 하시겠습니까? 그들은 그들의 자리를 가장 분명히 가지고 있습니다. 모든 관용구는 오용되고 남용 될 수 있습니다. 그러나 thread-> notification_queue의 애플리케이션 전반에 걸친 맵은 나에게 합당한 것처럼 보인다. – Mordachai
@Mordachai : 싱글 톤이 자리를 잡았다는 것을 알고 있으며이 대기열/스레드 맵이 완벽하게 유효 할 수도 있습니다. 몇 가지 단위 테스트를 쓰고있을 때 버그가 나기 시작했고 거기에 싱글 톤을 사용하는 것이 어색했다. –
어떤 스레드 라이브러리를 사용하고 있습니까? – outis