2012-01-02 10 views
8

Tôi đang chạy một máy chủ thỉnh thoảng phải tìm kiếm truy vấn của khách hàng. Tôi muốn viết các truy vấn khách hàng vào đĩa cho các bản ghi, nhưng tôi không muốn làm chậm tìm kiếm nữa so với tôi phải. (Tìm kiếm đã là nút cổ chai ...)Sử dụng đúng mẫu thiết kế singleton

Vì vậy, khi khách hàng thực hiện tìm kiếm, tôi có chủ đề của khách hàng gửi tin nhắn đến một chuỗi đơn, sẽ xử lý ghi đĩa, trong khi chuỗi khách hàng tiếp tục xử lý các yêu cầu của khách hàng. Bằng cách đó, các tập tin trên đĩa không chạy vào các vấn đề đồng bộ, và nó không làm chậm kinh nghiệm của khách hàng xuống.

Tôi có một câu hỏi khái niệm ở đây: là singleton thích hợp trong trường hợp này? Tôi đã sử dụng mẫu thiết kế singleton một chút quá nhiều trong chương trình gần đây của tôi, và tôi muốn chắc chắn rằng tôi đang sử dụng nó cho mục đích sử dụng của nó.

Bất kỳ phản hồi nào được đánh giá cao.

+3

Rất khó để trả lời câu hỏi này mà không thấy kiến ​​trúc tổng thể của bạn. Có những hạn chế đối với mẫu đơn (gây ra khó khăn trong việc kiểm tra đơn vị, v.v.), tùy thuộc vào bạn để xác định xem chúng có liên quan hay không ... –

+1

Cảm ơn phản ứng nhanh Oli; Tôi đã đọc về những khó khăn trong việc kiểm thử đơn vị nhưng không hiểu được những tác động tổng thể. Tại sao tránh tình trạng toàn cầu tầm quan trọng như vậy? Ví dụ, nếu chỉ có một tập tin trên đĩa mà một chương trình ghi vào, không ai muốn chắc chắn rằng nó không thể được truy cập cùng một lúc bởi các phần khác nhau? – Sal

+0

sự tồn tại của trạng thái toàn cầu có thể gây khó khăn cho việc chèn phụ thuộc (đây là cơ sở của [thử nghiệm giả lập] (http://en.wikipedia.org/wiki/Mock_object)). Xem bài nói chuyện này để biết thêm chi tiết: http://googletesting.blogspot.com/2008/11/clean-code-talks-global-state-and.html. –

Trả lời

7

singleton pattern chắc chắn bị lạm dụng và đi kèm với chia sẻ difficulties (thử nghiệm đơn vị là ví dụ kinh điển), nhưng giống như mọi thứ trong thiết kế, bạn cần cân nhắc ưu và khuyết điểm cho trường hợp cụ thể của mình. Mẫu đơn có sử dụng của nó. Có các tùy chọn có thể cho phép bạn nhận được hành vi đơn lẻ, đồng thời giảm bớt một số vấn đề cố hữu:

Interception (thường được gọi là lập trình theo hướng khía cạnh), mặc dù tôi đã thấy cuộc tranh luận rằng chúng không hoàn toàn giống nhau. .. không thể tìm thấy bài viết tôi đọc về điều này tại thời điểm này) chắc chắn là một lựa chọn. Bạn có thể sử dụng bất kỳ tổ hợp tiêm xây dựng nào, mẫu decorator, một nhà máy trừu tượng và một inversion of control container. Tôi không lên trên các thùng chứa Java IoC của tôi, nhưng có một số thùng chứa .Net cho phép chặn tự động (tôi tin Spring.Net, vì vậy có khả năng Spring (Java) đã tích hợp sẵn). Điều này rất thuận tiện cho bất kỳ loại mối quan tâm xuyên suốt nào, nơi bạn cần thực hiện một số loại hành động nhất định trên nhiều lớp (bảo mật, ghi nhật ký, v.v.). Ngoài ra, hầu hết các container IoC cho phép bạn kiểm soát quản lý suốt đời, vì vậy bạn có thể xử lý logger của bạn như một singleton, mà không cần phải thực sự thực hiện các mẫu Singleton theo cách thủ công.

Để tổng hợp. Nếu một singleton phù hợp cho kịch bản của bạn (có vẻ hợp lý từ mô tả của bạn), hãy cho nó. Chỉ cần chắc chắn rằng bạn đã cân nhắc những thuận và chống. Bạn có thể thử một cách tiếp cận khác và so sánh hai phương pháp này.