Bu gibi durumlarda "bağlam" terimini bazen birden çok katmanla başarılı bir şekilde tanıttım (yeniden kullandım).
Bu, bu tür nesnelerin talep edilebileceği tek birton, dolayısıyla "global" nesne deposu anlamına gelir. Onları gerektiren kodlar, mağazanın üstbilgisini içerir ve nesne örneklerini almak için genel işlevleri kullanır (şimdi olduğu gibi, faiz oranı sağlayıcısı).
Mağaza şunlardan biri olabilir:
- katı yazılır: sunulan tüm türlerin üstbilgilerini eklersiniz ve böylece InterestRate getCurrentInterestRate () gibi yazılı erişimciler oluşturabilirsiniz;
- veya generic: Object getObject (enum obType); ve obType enum değerini yalnızca yeni türlerle (obtypeCurrentInterestRate) uzatın.
Sistem büyüdükçe, yanlış numaralandırma kullanma riski oldukça düşüktür. Öte yandan, ileri tip bildirimlere izin veren dillerle, mağazadaki tüm başlıkları içermeden yazılı erişimcileri kullanabileceğinizi düşünüyorum.
Bir not daha: farklı kullanımlar için bazen GUI ve çıktı, genel ve oturum düzeyi günlükleri için farklı Dil değeri gibi aynı nesne türünde birden çok örneğiniz olabilir, bu nedenle numaralandırma / erişimci adı gerçek türü DEĞİL , ancak istenen örneğin rolü (CurrentInterestRate).
Mağaza uygulamasında, bağlam düzeylerini ve bağlam örneği koleksiyonlarını yönetmeniz gerekir. Basit bir örnek, genel bağlama (o nesne için tüm istekler için bir örnek - bir sunucu grubuna sahipken sorunlu) sahip olduğunuz web hizmeti ve her web oturumu için bir bağlamdır. Ayrıca, birden çok paralel oturum vb. Olabilecek her kullanıcı için bağlamlarınız olabilir. Birden çok sunucuyla bu tür şeyler için bir tür dağıtılmış önbellek kullanmalısınız.
İstek geldiğinde, istenen nesnenin hangi bağlam düzeyinde olduğuna karar verirsiniz, çağrı için bu bağlamı alırsınız. Nesne oradaysa, onu geri gönderirsiniz; değilse, bu bağlam düzeyinde oluşturup saklar ve iade edersiniz. Tabii ki, oluşturma bölümünü senkronize edin (ve dağıtılmış önbellekte yayınlayın). Oluşturma, en iyi sınıf adlarına (Java, Objective C, ...) göre nesne örnekleri oluşturmaya izin veren dillerle yapılandırılabilir eklenti benzeri olabilir, ancak bunu C'de de fabrika işlevlerine sahip takılabilir kitaplıklarla yapabilirsiniz.
Yan not: arayan kendi bağlamları ve istenen nesnenin bağlam seviyesi hakkında çok fazla şey bilmemelidir. Sebepler: 1: bu parametrelerle oynayarak hata yapmak (veya "akıllı numaralar") kolaydır; 2: istenen içerik düzeyi daha sonra değişebilir. Çoğunlukla bağlam bilgisini iş parçacığına bağlarım, böylece nesne deposu, istekten fazladan parametre içermeyen bilgilere sahiptir.
Öte yandan, istek örnek için bir ipucu içerebilir: belirli bir tarih için faiz oranı almak gibi. Aynı "genel" erişim olmalıdır, ancak tarihe bağlı olarak birden çok örnek olmalıdır (ve ücret değişiklikleri arasında aynı örneğe farklı tarih değerleri yönlendirir). Bu nedenle, istek tarafından kullanılan isteğe bir "ipucu" nesnesi eklemeniz önerilir. mağaza değil fabrika; ve mağaza tarafından kullanılan fabrikaya bir anahtar. Bu işlevleri daha sonra ekleyebilirsiniz, az önce bahsetmiştim.
Sizin durumunuz için bu bir tür aşırıya kaçmadır (küresel düzeyde sadece bir nesne servis edilir), ancak şu anda oldukça küçük ve basit bir ekstra kod için, belki de daha karmaşık gereksinimler için bir mekanizma elde edersiniz.
Başka bir iyi haber: Java'daysanız, bu hizmeti çok fazla düşünmeden Spring'den alırsınız, sadece ayrıntılı olarak açıklamak istedim.