Dalam situasi seperti itu saya telah berhasil memperkenalkan (menggunakan kembali) istilah "konteks" dengan terkadang beberapa lapisan.
Ini berarti singleton, dengan demikian menyimpan objek "global", dari mana objek semacam ini dapat diminta. Kode yang memerlukannya, sertakan tajuk toko, dan gunakan fungsi global untuk mendapatkan instance objek mereka (seperti sekarang, penyedia suku bunga).
Toko dapat berupa:
- diketik dengan ketat: Anda memasukkan header untuk semua jenis yang dilayani dan sehingga Anda dapat membuat pengakses yang diketik, seperti InterestRate getCurrentInterestRate ();
- atau generik: Objek getObject (enum obType); dan hanya memperpanjang obType enum dengan jenis baru (obtypeCurrentInterestRate).
Semakin besar sistem, semakin dapat digunakan solusi yang terakhir, untuk risiko yang cukup kecil menggunakan enum yang salah. Di sisi lain, dengan bahasa yang memungkinkan deklarasi tipe forward, saya pikir Anda dapat menggunakan pengetik yang diketik tanpa menyertakan semua header di toko.
Satu catatan lagi: Anda mungkin memiliki beberapa instance dari jenis objek yang sama untuk kegunaan yang berbeda, seperti nilai Bahasa yang terkadang berbeda untuk GUI dan untuk cetakan, log tingkat sesi dan global, dll, sehingga nama enum / accessor TIDAK boleh mencerminkan jenis aktual , tetapi peran instance yang diminta (CurrentInterestRate).
Dalam implementasi toko, Anda harus mengelola level konteks dan koleksi instance konteks. Contoh sederhana adalah layanan web, di mana Anda memiliki konteks global (satu contoh untuk semua permintaan untuk objek itu - bermasalah ketika memiliki server server), dan konteks untuk setiap sesi web. Anda juga dapat memiliki konteks untuk setiap pengguna, yang mungkin memiliki banyak, sesi paralel, dll. Dengan beberapa server Anda harus menggunakan semacam cache terdistribusi untuk hal-hal seperti itu.
Ketika permintaan masuk, Anda memutuskan tingkat konteks objek yang diminta, dapatkan konteks untuk panggilan itu. Jika objek ada di sana, Anda mengirimnya kembali; jika tidak, Anda membuat dan menyimpannya di tingkat konteks itu, dan mengembalikannya. Tentu saja, sinkronkan bagian pembuatan (dan publikasikan ke cache yang didistribusikan). Pembuatannya bisa seperti plugin yang dapat dikonfigurasi, paling baik dengan bahasa yang memungkinkan pembuatan instance objek dengan nama kelasnya (Java, Objective C, ...), tetapi Anda bisa melakukannya di C juga dengan pustaka pluggable yang memiliki fungsi pabrik.
Catatan: penelepon TIDAK boleh tahu terlalu banyak tentang konteksnya sendiri, dan tingkat konteks objek yang diminta. Alasan: 1: mudah membuat kesalahan (atau "trik pintar") dengan memainkan parameter ini; 2: tingkat konteks yang diminta dapat berubah nanti. Saya sebagian besar menghubungkan informasi konteks ke utas, sehingga toko objek memiliki informasi tanpa parameter tambahan dari permintaan.
Di sisi lain, permintaan dapat berisi petunjuk untuk contoh: seperti mendapatkan suku bunga untuk tanggal tertentu. Itu haruslah akses "global" yang sama, tetapi beberapa kejadian tergantung pada tanggal (dan mengarahkan nilai tanggal yang berbeda ke contoh yang sama di antara perubahan tarif), sehingga disarankan untuk menambahkan objek "petunjuk" ke permintaan, digunakan oleh pabrik contoh dan bukan toko; dan keyForHint ke pabrik, digunakan oleh toko. Anda dapat menambahkan fungsi-fungsi ini nanti, saya baru saja menyebutkan.
Untuk kasus Anda, ini adalah jenis pembunuhan berlebihan (hanya satu objek yang dilayani di tingkat global), tetapi untuk kode tambahan yang cukup kecil dan sederhana sekarang, Anda mendapatkan mekanisme untuk persyaratan lebih lanjut, mungkin lebih kompleks.
Berita bagus lainnya: jika Anda berada di Jawa, Anda mendapatkan layanan ini dari Spring tanpa berpikir terlalu banyak, saya hanya ingin menjelaskannya secara terperinci.