2012-01-31 3 views
5

웹 서비스에 대한 인터페이스 인 객체를 만들었습니다. 한 가지 전형적인 객체는 "TaskService"입니다. 클라이언트가 이러한 객체 중 하나를 사용하면 서비스의 메소드 중 하나 (예 : "GetTasks")를 호출하고 비동기 적으로 원격 웹 서비스를 호출하고 위임을 통해 검색된 데이터를 다시 게시합니다.대리인과의 싱글 톤 : 좋은 생각인가 나쁜가?

현재 이러한 서비스 중 하나를 사용하려면 [[TaskService alloc] init]을 사용하여 서비스를 만들어야하지만, 각 서비스를 싱글 톤 객체로 만드는 것이 더 합리적이라고 판단했습니다.

델리게이트를 참조하는 싱글 톤 객체를 보는 것이 일반적입니까? 디자인의 주요 문제점은 각 객체가 특정 서비스의 사용을 요구할 때마다 서비스를 호출하기 전에 위임자로 설정해야한다는 것입니다. 이는 나에게 맞는 것 같지 않습니다 ... 다른 객체 대리인으로 자신을 설정하고 서비스를 호출하는 사이에 대리인으로 자리 매김하는 것이 었습니까?

미리 감사드립니다.

감사합니다, 닉

답변

4

는 이모 이것은 당신이 언급 한 이유에 대한 좋은 생각이 아니다. 싱글 톤 패턴은 실제로는 하나만있는 것에 불과하지만 앱이 이러한 서비스의 여러 인스턴스를 필요로 할 수있는 것처럼 들립니다. 실제로 서비스의 여러 인스턴스를 인스턴스화해야 할 때 작업 대기열이나 대리자 멀티플렉서를 사용하여이 문제를 해결할 수 있다고 생각합니다.

+0

델리 케이트 멀티플렉서가 어떤 종류의 브로드 캐스터인지 전혀 알지 못합니다. 그러나 시도하고 구현하기에는 너무 복잡해 보입니다. 그래서 그렇게하려고 노력할 것입니다. 작업 대기열을 구현하려면 모든 메소드가 대리자/매개 변수를 인수로 사용해야한다고 생각하는 것이 맞습니까?그래서 "요청"은 대기 상태가 될 수 있으며 일단 연결된 대표는 완료되면 호출 될 수 있습니까? –

+0

대리자 멀티플렉서는 주어진 결과를 보낼 델리게이트를 파악하기 위해 싱글 톤 내부에 작성하는 코드를 작성한 용어입니다. op 큐는 각 작업 (대리인의 페치 및 알림)을 훨씬 잘 캡슐화합니다. 그래서 네, 요청이 이렇게 대기열에 넣어됩니다. – Rayfleck

4

경우가 Singleton 개체의 사용을 보증 할 때, 나는 항상 인용하는 이유 때문에 위임을 피한다. 싱글 톤의 소비자는 싱글 톤의 유일한 대리인으로 자신을 설정함으로써 다른 소비자의 발가락을 밟고 있는지 알 수 없습니다. NSNotifications은 작업을위한 훨씬 더 깨끗한 도구입니다. 임의의 수의 청취자는 다른 청취자를 돌보지 않고도 통지를 사용할 수 있습니다.

위임은 클래스간에 명확한 소유권이있는 경우에 가장 효과적입니다. 아무도 싱글 톤을 소유하지 않습니다.

+0

나는 NSNotifications에 대해 많이 모른다는 것을 인정해야한다. 그래서 그것을 살펴 봐야 할 것이다. 그러나 다른 언어의 개념과 비슷하지만 "청취자"가 목록에 추가되고 각 청취자가 특정 이벤트에 대해 통보되는 경우 익숙한 것처럼 들립니다. 이것은 나에게 맞을 것이다, 나는 생각한다, 팁을위한 그렇게 감사. –

+0

(Matt의 발가락을 밟지 말고 ...) 예, NSNotifications는 청취자와 유사합니다 (우리는 관찰자라고 부릅니다). IMO, 이번 주에 하나의 기술 만 배우면 그럴 것입니다. 특히 연결 해제 클래스와 해당 작업에서 매우 유용합니다. – Rayfleck

+0

팁 주셔서 감사. 나는 NSNotification을 즉시 체크 아웃 할 것이다! –

0

싱글 톤은 실제로 문제가 아닙니다. 클래스를 인스턴스화하고 전역 변수로 전달하면 같은 종류의 문제가 발생합니다. 다른 사람이 대기열을 언급 한 것처럼 가능성이 있습니다. 또는 Singleton의 서비스에서 작업을 호출 할 때 메서드 및 전달 대리인을 전달하는 TaskRequest 객체를 인스턴스화하면 요청이 서로를 트램핑 할 수 없습니다. 어쨌든 대기열로 처리하는 것이 좋습니다.

0

싱글 톤의 범위는 전체 응용 프로그램입니다. 예 : 쇼핑 응용 프로그램의 예를 로거 데이터, 주문, 지불, 장바구니 등과 같이 응용 프로그램의 다른 부분에서 액세스 할 수 있어야하는 사용자 ID에 대해 고려해 봅니다.

대리인은 1 대 1 통신, 예를 들면 다음과 같습니다. 두 가지 TV 및 원격 제어 장치 클래스가 있습니다. TV 채널을 변경하려고합니다. 채널 변경을위한 TV의 위임 방법은 원격 제어 장치 클래스에서 구현됩니다. 그래서 당신은 원격 제어 장치를 사용하고 당신은 TV의 채널을 변경합니다.

싱글 톤은 여러 수신자와 통신하는 데 사용되는 반면 위임 패턴은 일반적으로 1 대 1 통신에 사용됩니다.