Câu hỏi Lớp Singleton so với lớp có thành viên tĩnh


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ư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 lớp TaskQueue mà tôi muốn sử dụng để:

  • truy cập từ bất kỳ nơi nào trong mã của tôi để thêm hoặc xóa các tác vụ theo lịch
  • xử lý tự động các tác vụ theo lịch định kỳ

Khi TaskQueue được sử dụng lần đầu tiên, tôi muốn TaskQueue bắt đầu một chuỗi mà 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ối thiểu hai biến:

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

Vì tôi chỉ muốn một hàng đợi các nhiệm vụ và một luồng để xử lý các tác vụ này, tôi có hai lựa chọn:

  1. Đặt TaskQueue thành một lớp đơn (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 tại thời gian init.)

  2. Có các mảng nhiệm vụ và thể hiện thread đều là tĩnh (theo cách tiếp cận được đề xuất ở đây: Làm thế nào để khai báo các thuộc tính mức lớp trong Objective-C?)

Có một cách tiếp cận rõ ràng nào tốt hơn phương pháp tiếp cận khác trong trường hợp cụ thể này không? Nếu vậy, tại sao?


9
2017-12-31 05:06


gốc


bị lừa: stackoverflow.com/questions/519520/… - cregox


Các câu trả lời:


Sự khác biệt chính là những thứ đơ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ột mẫu nhà máy để xây dựng ví dụ của bạn

Nếu bạn không cần bất kỳ thứ gì trong số chúng, như với chức năng toàn cầu phải được truy cập tất cả xung quanh mã của bạn thì bạn có thể đi với các phương thức 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ó một lý do rõ ràng để sử dụng một cá thể đơn (chẳng hạn như có một giao diện chung nhưng các 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 sự cần thiết cho thứ hai, bạn sẽ tái cấu trúc nó một cách dễ dàng (sau đó bạn có bộ tiền xử lý C #define sẽ gần như đủ).


29
2017-12-31 05:11



Rõ ràng và súc tích. Cảm ơn. - Lolo
Một câu hỏi đặt ra 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
Bất kỳ đại biểu cacao tiêu chuẩn nào mà bạn đặt object.delegate = instance yêu cầu một thực thể 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