Chỉ một ngày khác tôi đã thấy mã sử dụng mẫu gọi là singleton. Có nghĩa là một cái gì đó dọc theo dòng củaSingleton - Tại sao nên sử dụng các lớp học?
class MySingleton{
public:
void foo() { ... }
static MySingleton&get_instance(){
static MySingleton singleton;
return singleton
}
private:
MySingleton(){ ... }
~MySingleton(){ ... }
int bar;
};
Tôi thấy lý do tại sao người ta sẽ muốn làm điều đó:
- Hãy trường hợp truy cập trên toàn cầu.
- Đảm bảo rằng không bao giờ có nhiều hơn một phiên bản của lớp đó.
Tuy nhiên, tôi không hiểu tại sao cách làm này lại vượt trội so với một vài chức năng miễn phí. Con đường tôi muốn thực hiện nó là đặt
namespace some_name{
void foo();
}
trong tiêu đề và
namespace some_name{
void foo(){
...
}
}
trong file thực thi. Nếu tôi cần khởi tạo và/hoặc dọn dẹp, tôi có thể thêm một số chức năng phải được gọi rõ ràng hoặc tôi thêm
namespace{
class Dummy{
Dummy(){ ... }
~Dummy(){ ... }
}dummy;
}
vào tệp triển khai.
Tôi biết rằng đây là từ một điểm ngữ nghĩa của xem một singleton, tuy nhiên tôi thấy biến thể đầu tiên được sử dụng thường xuyên hơn trong mã C++ so với thứ hai. Tại sao? Tôi coi phiên bản thứ hai là hơi cao hơn, vì vậy tôi tự hỏi bản thân mình nếu tôi thiếu một cái gì đó hiển nhiên.
- Phiên bản thứ hai đơn giản hơn để triển khai và ít bị lỗi hơn. Trong biến thể đầu tiên, hàm tạo bản sao riêng tư bị thiếu mục đích để chứng minh điều này. Trong biến thể thứ hai không có cách nào để làm lỗi này.
- Triển khai và giao diện được tách biệt tốt hơn trong phiên bản thứ hai. Trong tất cả các thành viên tư nhân đầu tiên phải được khai báo trong tiêu đề. Điều này có lợi thế là bạn có thể viết lại việc thực hiện từ đầu và thậm chí không cần phải biên dịch lại bất cứ thứ gì sử dụng singleton. Khi sử dụng biến thể đầu tiên, rất có khả năng bạn phải biên dịch lại tất cả mã người dùng ngay cả khi chỉ thay đổi các chi tiết triển khai nhỏ.
- Chi tiết triển khai bị ẩn trong cả hai trường hợp. Trong biến thể đầu tiên sử dụng riêng tư và trong biến thể thứ hai bằng cách sử dụng không gian tên không tên.
Bạn có thể giải thích cho tôi lý do mọi người sử dụng biến thể đầu tiên không? Tôi không thấy một lợi thế nào so với cách làm cũ tốt khi làm việc trong C.
Bạn không cần một hàm tạo bản sao trong mẫu đơn. Toàn bộ mục đích của mẫu đơn là để đảm bảo rằng một và chỉ một thể hiện của lớp có thể được tạo ra. – erelender
Khi thảo luận về singletons, cần thêm rằng singletons là mẫu thiết kế * bad * và cần tránh vì các lý do được nêu ở đây: http://stackoverflow.com/questions/1392315/problems-with-singleton-pattern –
zealots are vui vẻ –