Trong hầu hết các ngôn ngữ lập trình, các lớp loại bỏ rất nhiều kiểu hệ thống. Trong khi một lớp, với các phương thức và biến tĩnh của nó là một đối tượng, nó thường không thể triển khai một giao diện hoặc mở rộng các lớp khác. Vì lý do đó, nó không thể được sử dụng theo cách đa hình, vì nó không thể là kiểu con của một kiểu khác. Ví dụ, nếu bạn có một giao diện IFooable
, được yêu cầu bởi một số ký hiệu phương thức của các lớp khác, thì đối tượng lớp StaticFoo
không thể được sử dụng thay thế IFooable
, ngược lại FooSingleton.getInstance()
có thể (giả sử, FooSingleton
thực hiện IFooable
).
Xin lưu ý rằng, như tôi đã nhận xét về câu trả lời của Heinzi, một singleton là một mẫu để kiểm soát việc khởi tạo. Nó thay thế new Class()
bằng Class.getInstance()
, cung cấp cho tác giả Class
quyền kiểm soát nhiều hơn đối với các cá thể mà anh ta có thể sử dụng để ngăn chặn việc tạo ra các cá thể không cần thiết. Singleton chỉ là một trường hợp rất đặc biệt của mô hình nhà máy và nên được xử lý như vậy. Việc sử dụng phổ biến khiến nó trở thành trường hợp đặc biệt của các sổ đăng ký toàn cầu, thường kết thúc không tốt, bởi vì các đăng ký toàn cầu không nên được sử dụng hoàn toàn.
Nếu bạn định cung cấp các hàm trợ giúp toàn cục, thì các phương thức tĩnh sẽ hoạt động tốt. Lớp sẽ không hoạt động như một lớp, mà chỉ là một không gian tên. Tôi khuyên bạn nên duy trì sự gắn kết cao, nếu không bạn có thể gặp phải các vấn đề khớp nối kỳ lạ nhất.
Greetz
back2dos