2012-01-31 39 views
5

Tôi đã tạo các đối tượng là giao diện cho một dịch vụ web. Một đối tượng điển hình sẽ là "TaskService". Khi một máy khách sử dụng một trong các đối tượng này, nó sẽ gọi một trong các phương thức của dịch vụ (chẳng hạn như "GetTasks") và dịch vụ sẽ không đồng bộ đi để gọi dịch vụ web từ xa và đăng lại dữ liệu đã truy xuất qua đại biểu.Singleton với một đại biểu: Ý tưởng hay xấu?

Hiện tại, để sử dụng một trong các dịch vụ này, bạn phải tạo nó với [[TaskService alloc] init], nhưng tôi quyết định làm cho mỗi dịch vụ trở thành đối tượng đơn giản hơn.

Có thường thấy các đối tượng đơn lẻ giữ tham chiếu đến đại biểu không? Vấn đề chính của tôi với thiết kế, là mỗi đối tượng, bất cứ khi nào nó yêu cầu sử dụng một dịch vụ cụ thể, sẽ phải tự thiết lập làm đại biểu trước khi gọi dịch vụ, điều này dường như không đúng đối với tôi ... đã được thiết lập chính nó như là đại biểu inbetween bạn đặt mình là đại biểu và gọi dịch vụ?

Rất cám ơn trước!

Kính trọng, Nick

Trả lời

4

Imo đây không phải là một ý tưởng tốt vì lý do bạn trích dẫn. Mẫu Singleton thực sự dành cho mọi thứ chỉ có một trong số đó, nhưng có vẻ như ứng dụng của bạn có thể cần nhiều phiên bản của các dịch vụ này. Tôi nghĩ rằng bạn muốn làm việc xung quanh điều này (sử dụng một hàng đợi hoạt động hoặc một số loại multiplexer đại biểu) khi bạn thực sự chỉ cần để nhanh chóng nhiều trường hợp của dịch vụ của bạn.

+0

Tôi không biết một multiplexer đại biểu là gì (broadcaster của một số loại?), Nhưng nó có vẻ quá phức tạp đối với tôi để thử và thực hiện, vì vậy tôi sẽ cố gắng và ở lại rõ ràng bất cứ điều gì như thế! Để thực hiện một hàng đợi hoạt động, liệu tôi có đúng khi nghĩ rằng mọi phương thức sẽ phải lấy một đại biểu/tham số làm đối số?Vì vậy, "yêu cầu", có thể được xếp hàng đợi, với các đại biểu liên quan được gọi khi hoàn thành? –

+0

Một multiplexer đại biểu là một thuật ngữ tôi chỉ cần thực hiện cho mã bạn muốn viết bên trong singleton của bạn để tìm ra đại biểu để gửi bất kỳ kết quả nhất định. Một hàng đợi op sẽ đóng gói tốt hơn mỗi hoạt động (lấy và thông báo của đại biểu). Vì vậy, có, yêu cầu sẽ được xếp hàng theo cách này. – Rayfleck

4

Khi dịp này đảm bảo việc sử dụng đối tượng Singleton, tôi luôn tránh ủy quyền vì lý do bạn trích dẫn. Người tiêu dùng của một singleton không thể biết (nếu không có một số mã hóa xấu xí) nếu họ đang bước vào một số ngón chân của người tiêu dùng khác bằng cách thiết lập mình là đại biểu duy nhất của singleton. NSNotifications là một công cụ sạch hơn cho công việc; bất kỳ số lượng người nghe bất kỳ nào có thể tiêu thụ thông báo mà không cần quan tâm đến những người khác có thể đang nghe.

Ủy quyền hoạt động tốt nhất khi có quyền sở hữu rõ ràng giữa các lớp học. Không ai sở hữu một singleton.

+0

Tôi phải thừa nhận, tôi thực sự không biết nhiều về NSNotifications, vì vậy sẽ phải xem xét điều đó. Có vẻ như nó có thể tương tự như một khái niệm trong các ngôn ngữ khác mà tôi quen thuộc với tuy nhiên, nơi "người nghe" được thêm vào danh sách và mỗi người nghe được thông báo khi có một số sự kiện nhất định. Điều này sẽ phù hợp với tôi, tôi nghĩ, vì vậy cảm ơn cho tip. –

+0

(Không phải bước vào ngón chân của Matt nhưng ...) có, NSNotifications tương tự như người nghe (chúng tôi gọi họ là người quan sát). IMO, nếu bạn chỉ học một kỹ thuật trong tuần này, điều đó sẽ là nó - chúng cực kỳ hữu ích, đặc biệt là trong các lớp không liên kết và các nhiệm vụ tương ứng của chúng. – Rayfleck

+0

Cảm ơn lời khuyên. Tôi sẽ kiểm tra NSNotifications ngay lập tức! –

0

Singleton không thực sự là vấn đề, bạn gây ra cùng một loại vấn đề bằng cách đơn giản hóa một lớp và chuyển nó về như một biến toàn cục. Như người khác đã đề cập đến một hàng đợi là một khả năng, hoặc khi bạn gọi một nhiệm vụ trên một dịch vụ trong Singleton của bạn có nó là một đối tượng TaskRequest đi qua trong phương thức và gọi lại đại biểu, theo cách đó yêu cầu không thể chà đạp lẫn nhau. Trong thực tế nó sẽ là một ý tưởng tốt để làm điều đó với một hàng đợi anyway.

0

Phạm vi của một singleton là toàn bộ ứng dụng. Ví dụ: Hãy xem xét ví dụ về ứng dụng mua sắm dữ liệu nhật ký, về ID người dùng cần truy cập trên một phần ứng dụng khác như đơn hàng, thanh toán, giỏ hàng, v.v.

Đại biểu được sử dụng cho giao tiếp 1-1, ví dụ: Bạn có thể lấy ví dụ Bạn có hai lớp TV và thiết bị điều khiển từ xa. Bạn muốn thay đổi kênh truyền hình. Các phương thức ủy quyền của TV để thay đổi kênh được thực hiện trong lớp thiết bị điều khiển từ xa. Vì vậy, bạn sử dụng thiết bị điều khiển từ xa và bạn thay đổi kênh của TV.

Singleton được sử dụng để giao tiếp với nhiều người nhận, trong khi mẫu ủy quyền thường được sử dụng cho giao tiếp 1-1.

Các vấn đề liên quan