Singleton modeli hakkında farklı görüşler okudum. Bazıları, her ne pahasına olursa olsun kaçınılması gerektiğini, bazılarında ise belirli durumlarda yararlı olabileceğini savunuyor.
Singletons kullandığım bir durum, belirli bir A sınıfının nesnelerini oluşturmak için bir fabrikaya (F tipi bir f nesnesi diyelim) ihtiyacım olduğu zamandır. A tipi başlatıldı. Böylece, A'yı başlatmak isteyen kodun her bir parçası, singleton f'yi alır ve yeni örneği yaratır.
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Yani general benim senaryom şudur
- En iyi duruma getirme nedenlerinden (birden fazla fabrika nesnesine ihtiyacım yok) veya ortak durumu paylaşmak için yalnızca bir sınıf örneğine ihtiyacım var (örneğin, fabrika hala kaç tane A örneği oluşturabileceğini biliyor)
- Kodun farklı yerlerinde F'nin bu örneğine erişebilmek için bir yola ihtiyacım var.
Ben am ilgilenen değil bu model iyi ya da kötü olup olmadığı tartışmaya, ama a tek kullanmaktan kaçınmak istiyor varsayarak başka hangi model kullanabilir miyim?
Sahip olduğum fikirler (1) fabrika nesnesini bir sicilden almak için ya da (2) fabrikayı program başlangıcında bir noktada oluşturmak ve ardından fabrikayı bir parametre olarak dolaştırmaktı.
Çözüm (1) 'de kayıt defterinin kendisi bir tekildir, bu yüzden fabrikadan kayıt defterine bir tekil kullanmama problemini değiştirdim.
(2) Durumda, fabrika nesnesinin geldiği bir başlangıç kaynağına (nesnesine) ihtiyacım var, bundan dolayı tekrar başka bir singleton'a (fabrika örneğimi sağlayan nesne) geri döneceğime korkuyorum. Bu singleton zincirini takip ederek problemi diğer tüm singletonların doğrudan veya dolaylı olarak yönetildiği bir singleton'a (bütün başvuru) azaltabilirim .
Bu son seçenek (diğer tüm benzersiz nesneleri yaratan ve tüm diğer singletonları doğru yerlere enjekte eden bir ilk singleton kullanmak) kabul edilebilir bir çözüm olabilir mi? Bu, kişi tekil ton kullanmamanızı önerdiğinde dolaylı olarak önerilen bir çözüm mü, yoksa yukarıda gösterilen örnekte başka çözümler neler midir?
DÜZENLE
Sorumun amacının bazıları tarafından yanlış anlaşıldığını düşündüğümden, işte biraz daha bilgi var. Örneğin burada açıklandığı gibi , singleton kelimesi (a) tek bir örnek nesnesi olan bir sınıfı ve (b) böyle bir nesneyi oluşturmak ve ona erişmek için kullanılan bir tasarım modelini belirtebilir.
İşleri netleştirmek için (a) için benzersiz nesne terimini , (b) için singleton desenini kullanmamıza izin verin . Bu yüzden, singleton paterni ve bağımlılık enjeksiyonunun ne olduğunu biliyorum (BTW, son zamanlarda üzerinde çalıştığım bazı kodlardan singleton paterninin örneklerini kaldırmak için DI'yi yoğun bir şekilde kullanıyorum).
Demek istediğim, tüm nesne grafiği ana yöntemin yığında yaşayan tek bir nesneden başlatılmadığı sürece, her zaman benzersiz nesnelere tekil desen üzerinden erişmeye ihtiyaç duyulacak.
Benim sorum, tam nesne grafiği oluşturma ve kablolamanın olmasının ana yönteme bağlı olup olmadığına (ör. Kalıbı kullanmayan güçlü bir DI çerçeve aracılığıyla) tek tekil kalıpsız çözümdür.