2012-12-31 38 views
9

Mặc dù có nhiều chủ đề về chủ đề đó, tôi vẫn chưa rõ khi nào nên chọn cách tiếp cận nào. Tôi hy vọng rằng bằng cách thảo luận một ví dụ cụ thể, cuối cùng tôi sẽ "hiểu nó".Lớp Singleton so với lớp có thành viên tĩnh

Lưu ý: Ngôn ngữ của tôi ở đây là Cocoa mặc dù vấn đề chung không phải là ngôn ngữ cụ thể.

Tôi có một hàng tác vụ lớp mà tôi muốn sử dụng để:

  • truy cập từ bất cứ nơi nào trong mã của tôi để thêm hoặc loại bỏ nhiệm vụ theo lịch trình
  • quá trình tự động các nhiệm vụ theo lịch trình đều đặn

Khi TaskQueue được sử dụng lần đầu tiên, tôi muốn TaskQueue bắt đầu một chuỗi và sau đó sẽ thức dậy theo các khoảng thời gian đều đặn để xử lý các tác vụ.

Rõ ràng, tôi sẽ cần ít nhất hai biến:

  • một mảng để lưu trữ các nhiệm vụ
  • một thể hiện của các chủ đề xử lý các nhiệm vụ

Kể từ khi tôi chỉ muốn một hàng đợi các nhiệm vụ và một chuỗi để xử lý các tác vụ này, tôi có hai lựa chọn:

  1. Hãy hàng tác vụ một lớp singleton (sử dụng ví dụ CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR như mô tả trong http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html, mà tôi tin rằng tôi sẽ phải sửa đổi các tập tin CWLSynthesizeSingleton.h để bắt đầu thread lúc init.)

  2. Có hàng loạt các nhiệm vụ và các chủ đề Ví dụ cả tĩnh (sau đây phương pháp này gợi ý ở đây: How do I declare class-level properties in Objective-C?)

có rõ ràng một cách tiếp cận đó là tốt hơn so với một trong những khác trong trường hợp cụ thể này? Nếu vậy, tại sao?

+0

bị lừa: http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern?lq=1 – cregox

Trả lời

29

Sự khác biệt chính là những điều đơn giản như:

  • với một singleton bạn có thể vượt qua xung quanh đối tượng cho các đại biểu và callbacks
  • với một singleton bạn có thể thực hiện các giao diện và lấy được nó
  • với một singleton bạn có thể sử dụng mẫu nhà máy để xây dựng ví dụ của mình

Nếu bạn không cần bất kỳ thiết bị nào, như với chức năng toàn cầu phải được truy cập tất cả xung quanh yo mã ur sau đó bạn có thể đi với các phương pháp tĩnh.

Cá nhân tôi thích sử dụng các phương thức tĩnh trừ khi tôi có lý do rõ ràng để sử dụng một cá thể đơn (chẳng hạn như có giao diện chung nhưng triển khai khác nhau).

Hãy nhớ rằng việc tái cấu trúc các phương thức tĩnh thành một cá thể đơn giản là một quá trình đơn giản, vì vậy nếu bạn tìm thấy nhu cầu thứ hai, bạn sẽ tái cấu trúc nó dễ dàng (sau đó bạn có bộ tiền xử lý C, #define)).

+0

Xóa và súc tích. Cảm ơn. – Lolo

+2

Một câu hỏi là: Bạn có thể cung cấp một ví dụ về kịch bản khi truyền xung quanh đối tượng cho các đại biểu và callback sẽ hữu ích/được yêu cầu trái ngược với việc sử dụng các phương thức tĩnh và không phải truyền xung quanh đối tượng nào không? – Lolo

+2

Bất kỳ đại biểu ca cao tiêu chuẩn nào mà bạn đặt bởi 'object.delegate = instance' yêu cầu một đối tượng thực của một đối tượng. Một lớp với các phương thức tĩnh không thể được sử dụng trong kịch bản như vậy để hoàn thành vai trò của một đại biểu. Nếu một cơ chế gọi lại/ủy nhiệm được bạn thực hiện thì bạn luôn có thể tránh được sự cần thiết của các cá thể thực. – Jack

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