2009-04-06 40 views
12

Không phải là một lớp học với tất cả các thành viên/phương pháp tĩnh một loại mẫu thiết kế đơn lẻ? Có bất kỳ bất lợi đặc biệt của việc có các lớp học như vậy? Giải thích chi tiết sẽ giúp ích.lớp tĩnh và singleton

Trả lời

17

Loại lớp này được gọi là monostate - nó hơi khác với một singleton.

Tại sao nên sử dụng đơn vị quảng cáo thay vì một singleton? Trong original paper của họ trên các mô hình, Chuông & Crawford gợi ý ba reasonns (diễn giải của tôi):

  • cú pháp More truy cập tự nhiên
  • singleton thiếu một tên
  • dễ dàng hơn để kế thừa từ

tôi phải thừa nhận, tôi không tìm thấy bất kỳ điều nào đặc biệt hấp dẫn. Mặt khác, monostate chắc chắn không có số tồi tệ hơn so với singleton.

+0

Khác nhau có, nhưng nó không đạt được chính xác điều tương tự? Tôi không thể thấy làm thế nào điều này có bất kỳ lợi thế hay bất lợi trên singleton "truyền thống", trong C + + ít nhất. –

+0

Có sự khác biệt rằng không gian sẽ không được phân bổ cho một singleton trừ khi nó được sử dụng, nhưng trong thực tế một đối tượng singleton mà không bao giờ được sử dụng có vẻ như một trường hợp hiếm hoi. Có ai có một trường hợp sử dụng phổ biến, nơi điều này sẽ là quan trọng? –

+0

Tôi cũng có xu hướng nghĩ rằng tính năng lười biếng-xây dựng của singletons điển hình là vô ích trong hầu hết các trường hợp - những nơi mà chúng tôi chỉ cần một biến toàn cầu. Tuy nhiên, trong trường hợp thư viện, chúng tôi có thể cần xây dựng trên máy bay để đơn giản hóa mã người dùng (nhà phát triển thực sự) của người dùng cuối. –

15

Robert C. Martin đã viết article một số lần trước đây về sự khác biệt giữa mẫu trạng thái đơn âm và mẫu đơn.

+1

Dựa trên bài viết, sự khác biệt duy nhất mà tôi có thể thấy là trong Java, việc hủy một Monostate được đảm bảo nhưng không thể chuyển giữa các JVM - có bất kỳ khác biệt nào liên quan đến C++ không? –

+0

Nó chính xác giống với các biến khác. Nếu nó được phân bổ động, nó sẽ được deallocated với một deallocator tương thích. Nếu nó nằm trong kho lưu trữ tĩnh (xem GOTW/XC++, IIRC), nó sẽ bị hủy và kết thúc chương trình, nhưng không có cách nào để thực hiện các phụ thuộc. –

+0

Về khía cạnh phụ thuộc, các bộ đồ loki của A.Alexandrescu (từ MC++ D), và các bộ đơn ACE cho phép xác định các phụ thuộc. BTW, họ đều là những người độc thân không xâm phạm. –

0

Đối với tất cả các nhà xây dựng đơn lẻ phải riêng tư, để bạn chỉ có thể truy cập thông qua một hàm. Nhưng bạn khá gần với nó.

+1

sai sai. – Thomasz

+0

Nếu bạn thực sự nghĩ rằng bạn nên đọc về singletons một lần nữa. Tư nhân xây dựng và một hoặc nhiều thành viên tĩnh chỉ accessilbe thông qua một chức năng thành viên công cộng là định nghĩa của một singleton – DaClown

+1

Nếu câu trả lời này là sai đến mức nó xứng đáng 5 downvotes, bạn có thể để lại một bình luận tại sao? Một cái gì đó như 'sai sai sai' là không hữu ích và tôi vẫn không tin rằng tôi sai. – DaClown

1

lớp với tất cả các thành viên tĩnh/phương pháp một loại mẫu thiết kế Singleton

Class - không mẫu. Khi chúng ta nói về các lớp, chúng ta có thể nói lớp thực hiện mẫu.


Chức năng tĩnh - không phải là chức năng của thành viên, chúng tương tự về chức năng toàn cầu. Có lẽ bạn không cần bất kỳ lớp học?

Trích từ wikipedia:

Trong công nghệ phần mềm, các singleton mô hình là một mẫu thiết kế đó là sử dụng để hạn chế instantiation của một lớp đến một đối tượng.

Theo định nghĩa này thực hiện của bạn không phải là thực hiện singleton - bạn không sử dụng ý tưởng chung One (hoặc một số trong định nghĩa mở rộng) thể hiện của lớp.

Nhưng đôi khi (không phải lúc nào) sử dụng lớp với tất cả các hàm tĩnh và mẫu đơn - không có sự khác biệt có ý nghĩa.

2

Xem xét một họ các lớp Ghi nhật ký. Một số gửi tin nhắn đến stderr, một số gửi email đến một nhóm các nhà phát triển, một số tăng số lượng tin nhắn cụ thể trong một bảng tần số tin nhắn, một số tuyến đường đến/dev/null .Khi chạy, chương trình sẽ kiểm tra các tham số vector, registry hoặc các biến môi trường mà kỹ thuật Logging sử dụng và instantiates Logging Singleton với một đối tượng từ một lớp thích hợp, có thể tải một DLL do người dùng cung cấp. Chức năng đó rất khó để sao chép với một Singleton tĩnh thuần túy.

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