Tôi không phải là một hater của singletons, nhưng tôi biết họ bị lạm dụng và vì lý do đó tôi muốn tìm hiểu để tránh sử dụng chúng khi không cần thiết.Cần trợ giúp tránh việc sử dụng Singleton
Tôi đang phát triển ứng dụng là nền tảng chéo (Windows XP/Vista/7, Windows Mobile 6.x, Windows CE5, Windows CE6). Là một phần của quy trình, tôi sẽ tính lại mã vào các dự án riêng biệt, để giảm trùng lắp mã, và do đó có cơ hội sửa lỗi của hệ thống sinh dục.
Một phần như vậy của ứng dụng đang được tạo riêng biệt khá đơn giản, đó là trình quản lý hồ sơ. Dự án này chịu trách nhiệm lưu trữ Hồ sơ. Nó có một lớp Profile
chứa một số dữ liệu cấu hình được sử dụng bởi tất cả các phần của ứng dụng. Nó có một lớp học ProfileManager
có chứa Profiles
. ProfileManager
sẽ đọc/lưu Profiles
dưới dạng tệp XML riêng biệt trên đĩa cứng và cho phép ứng dụng truy xuất và đặt "hoạt động" Profile
. Đơn giản.
Trong lần xây dựng bên trong đầu tiên, GUI là SmartGUI chống mẫu. Đó là một thực hiện WinForms mà không MVC/MVP thực hiện bởi vì chúng tôi muốn nó hoạt động sớm hơn là được thiết kế tốt. Điều này dẫn đến ProfileManager
là một singleton. Điều này là như vậy từ bất cứ nơi nào trong ứng dụng, GUI có thể truy cập vào hoạt động Profile
.
Điều này có nghĩa là tôi chỉ có thể đi ProfileManager.Instance.ActiveProfile
để truy xuất cấu hình cho các phần khác nhau của hệ thống nếu cần. Mỗi GUI cũng có thể thay đổi cấu hình, vì vậy mỗi GUI có một nút lưu, vì vậy tất cả chúng đều có quyền truy cập vào phương thức ProfileManager.Instance.SaveActiveProfile()
.
Tôi thấy không có gì sai trong việc sử dụng singleton ở đây, và bởi vì tôi thấy không có gì sai trong nó nhưng biết singletons không phải là lý tưởng. Có cách nào tốt hơn nên xử lý không? Một cá thể của ProfileManager có được chuyển vào mọi Controller/Presenter không? Khi ProfileManager được tạo, các thành phần cốt lõi khác sẽ được tạo và đăng ký các sự kiện khi các cấu hình được thay đổi. Ví dụ này khá đơn giản, và có lẽ là một tính năng phổ biến trong nhiều hệ thống, vì vậy nghĩ rằng đây là một nơi tuyệt vời để học cách tránh những người độc thân.
P.s. Tôi đang phải xây dựng ứng dụng với Compact Framework 3.5, điều này không giới hạn rất nhiều các lớp .Net Framework thông thường có thể được sử dụng.
Tôi chỉ có thể bị mắc kẹt trong thói quen cũ của mình, nhưng tôi thấy đây là một ví dụ điển hình về việc nên sử dụng Singleton ở đâu. –
Điều này thực sự âm thanh như trường hợp lý tưởng cho một trường hợp singleton. – msarchet
Cảm ơn tất cả các câu trả lời, nó xuất hiện đây là một nơi thích hợp để sử dụng Singleton. Phản hồi về nhà máy/phụ thuộc tiêm sẽ được đưa vào tài khoản, tuy nhiên như ứng dụng này sẽ chạy trong nền tôi sẽ có khả năng để nó như là một Singleton cho cả đơn giản và hiệu suất. – JonWillis