Trong các tình huống như vậy, tôi đã giới thiệu thành công (tái sử dụng) thuật ngữ "bối cảnh" với đôi khi nhiều lớp.
Điều này có nghĩa là một cửa hàng đối tượng "toàn cầu", do đó các loại đối tượng này có thể được yêu cầu. Các mã yêu cầu chúng, bao gồm tiêu đề của cửa hàng và sử dụng các hàm toàn cầu để lấy các thể hiện đối tượng của chúng (như bây giờ, nhà cung cấp lãi suất).
Cửa hàng có thể là:
- được gõ đúng: bạn bao gồm các tiêu đề cho tất cả các loại được phục vụ và do đó bạn có thể tạo các bộ truy cập đã nhập, như InterestRate getCienInterestRate ();
- hoặc chung chung: Object getObject (enum obType); và chỉ mở rộng enum obType với các loại mới (obtypeCienInterestRate).
Hệ thống càng lớn, giải pháp sau càng có thể sử dụng được, vì rủi ro khá nhỏ khi sử dụng enum sai. Mặt khác, với các ngôn ngữ cho phép khai báo kiểu chuyển tiếp, tôi nghĩ bạn có thể sử dụng các bộ truy cập được gõ mà không bao gồm tất cả các tiêu đề trong cửa hàng.
Thêm một lưu ý: bạn có thể có nhiều phiên bản của cùng một loại đối tượng cho các mục đích sử dụng khác nhau, như đôi khi giá trị Ngôn ngữ khác nhau cho GUI và cho bản in, nhật ký cấp toàn cầu và phiên, v.v., vì vậy tên enum / accessor KHÔNG nên phản ánh loại thực tế , nhưng vai trò của thể hiện được yêu cầu (CurrentInterestRate).
Trong triển khai cửa hàng, bạn phải quản lý các mức ngữ cảnh và các bộ sưu tập thể hiện ngữ cảnh. Một ví dụ đơn giản là dịch vụ web, nơi bạn có bối cảnh toàn cầu (một ví dụ cho tất cả các yêu cầu cho đối tượng đó - có vấn đề khi có cụm máy chủ) và bối cảnh cho mỗi phiên web. Bạn cũng có thể có bối cảnh cho từng người dùng, những người có thể có nhiều phiên song song, v.v. Với nhiều máy chủ, bạn nên sử dụng một loại bộ đệm được phân phối cho những thứ đó.
Khi yêu cầu đến, bạn quyết định mức ngữ cảnh của đối tượng được yêu cầu, lấy bối cảnh đó cho cuộc gọi. Nếu đối tượng ở đó, bạn gửi lại; nếu không, bạn tạo và lưu trữ nó ở mức ngữ cảnh đó và trả lại. Tất nhiên, đồng bộ hóa phần tạo (và xuất bản nó vào bộ đệm được phân phối). Việc tạo có thể giống như plugin có thể định cấu hình, tốt nhất với các ngôn ngữ cho phép tạo các thể hiện đối tượng theo tên lớp của chúng (Java, Objective C, ...), nhưng bạn cũng có thể làm điều đó trong C với các thư viện có thể cắm được có chức năng xuất xưởng.
Lưu ý bên lề: người gọi KHÔNG nên biết quá nhiều về bối cảnh của chính nó và mức ngữ cảnh của đối tượng được yêu cầu. Lý do: 1: rất dễ mắc lỗi (hoặc "thủ thuật thông minh") bằng cách chơi với các tham số này; 2: mức ngữ cảnh của yêu cầu có thể thay đổi sau này. Tôi chủ yếu kết nối thông tin ngữ cảnh với luồng, vì vậy kho đối tượng có thông tin mà không cần thêm tham số từ yêu cầu.
Mặt khác, yêu cầu có thể chứa gợi ý cho ví dụ: như nhận lãi suất cho một ngày cụ thể. Nó phải là cùng một quyền truy cập "toàn cầu", nhưng nhiều trường hợp tùy thuộc vào ngày (và dẫn các giá trị ngày khác nhau đến cùng một thể hiện giữa các thay đổi tốc độ), vì vậy nên thêm một đối tượng "gợi ý" vào yêu cầu, được sử dụng bởi nhà máy sản xuất và không phải là cửa hàng; và một keyForHint cho nhà máy, được sử dụng bởi các cửa hàng. Bạn có thể thêm các chức năng này sau, tôi chỉ đề cập.
Đối với trường hợp của bạn, đây là một loại quá mức (chỉ có một đối tượng được phục vụ ở cấp độ toàn cầu), nhưng đối với một mã bổ sung khá nhỏ và đơn giản ngay bây giờ, bạn có một cơ chế cho các yêu cầu phức tạp hơn, có lẽ phức tạp hơn.
Một tin tốt khác: nếu bạn ở Java, bạn nhận được dịch vụ này từ Spring mà không phải suy nghĩ quá nhiều, tôi chỉ muốn giải thích chi tiết về nó.