từ chối trách nhiệm: Tôi đang nói về java đây
singleton hiện đang được coi là một antipattern chủ yếu là bởi vì đã bị lạm dụng rất nhiều thời gian gần đây như họ là một cách nhanh chóng và thuận tiện để chia sẻ dữ liệu giữa các ứng dụng - đó là hơi một overextension của mẫu thiết kế đó là phù hợp hơn để cung cấp acces kiểm soát một tài nguyên được chia sẻ.
xem xét đầu ra tiêu chuẩn của chương trình: quyền truy cập tài nguyên đó cần được bảo vệ bởi một điểm truy cập duy nhất để cho phép đồng bộ hóa ghi, đó là lý do tại sao bạn có ví dụ System.out dưới dạng đối tượng tĩnh trong java.
vấn đề là, khi bạn bắt đầu có singleton bạn sẽ cần phải biết mọi chi tiết gritty nitty của những gì bạn đang làm, bởi vì bạn đang làm rất nhiều giả định nghiêm ngặt về lớp singleton của bạn, quan trọng nhất mà nó sẽ là lớp duy nhất trong hệ thống. sau đó bạn bắt đầu sử dụng nó, giả sử rằng nó sẽ luôn là một điểm vào tài nguyên của bạn, và sau đó lỗi khó chịu phát sinh vì lớp của bạn hiện đã được triển khai trên máy chủ ejb và mỗi ngữ cảnh ejb có singleton riêng, cộng thêm một singleton nữa mỗi jsp đã được tải lại từ máy chủ, cộng với một singleton cho mỗi lần singleton của bạn đã được tuần tự hóa và deserialized (như bạn có thể đã quên ghi đè phương thức readResolve()).
vì vậy đây là lý do tại sao singleton phải được sử dụng với rất nhiều dịch vụ chăm sóc và hiện được coi là một mẫu đối tượng mặc dù chúng hoàn toàn hữu ích cho mục đích sử dụng của chúng.
trong trường hợp bộ đệm cơ sở dữ liệu, sẽ là cách tiếp cận tốt hơn để yêu cầu bộ nhớ cache sử dụng proxy cho tài nguyên "cache" này, vì vậy bạn có thể thêm logic để "tìm tài nguyên" trong bản thân proxy thay vì có logic được gắn với việc truy xuất bộ nhớ cache singleton, có thể có hoặc không hoạt động tùy thuộc vào môi trường.
vì vậy trong vài từ sử dụng singleton như phương tiện để có quyền truy cập chia sẻ tài nguyên là xấu, bởi vì bạn đang hardcoding phương pháp tìm tài nguyên (và bỏ qua các bẫy đơn) trong khi có singleton để kiểm soát tài nguyên cho mục đích đồng bộ hóa là hoàn toàn chấp nhận được.
nghĩ về các ẩn dụ, những công trình này chỉ hoạt động nếu bạn có thể nhận được cùng một semaphore luôn. trong trường hợp thứ hai này có thể là vấn đề khi truy cập singleton từ mọi nơi bạn cần truy cập semaphore: ở đây bạn sẽ cần một lớp để bọc singleton lên và cung cấp sự kiểm soát tốt hơn vòng đời của semaphore.
proxy nhằm đảm bảo vai trò "cung cấp tài nguyên trên toàn hệ thống", có thể là một ứng dụng đơn lẻ, hệ thống máy chủ ứng dụng, các thành phần khác nhau của cùng một hệ thống và như vậy, với lợi ích bổ sung với èrpxy phương pháp truy xuất tài nguyên là mờ đục. bạn có thể yêu cầu họ cung cấp cho bạn một singleton chứa một hashmap của các giá trị được lưu trữ, bạn có thể cho họ truy cập vào memcached somwhere trên mạng, bạn có thể cho họ đọc một csv trong các bài kiểm tra, tất cả mà không thay đổi cách bạn gọi chúng từ ứng dụng.
mẫu thiết kế mindmap: http://www.mindmeister.com/7008138/design-patterns – jldupont