Tasarım desenleri hakkında: Singleton'u ne zaman kullanmalıyım?


448

Yüceli küresel değişken - yüceli bir küresel sınıf haline gelir. Bazıları nesne odaklı tasarımı kırmayı söylüyor.

Singletonu kullanmanın mantıklı olduğu eski iyi kaydedici dışında senaryolar ver.


4
Erlang öğrendiğimden beri, bu yaklaşımı, yani değişmezliği ve mesaj geçişini tercih ederim.
Setori

209
Bu soru hakkında yapıcı olmayan nedir? Yapıcı cevapları aşağıda görüyorum.
mk12

3
Bağımlılık enjeksiyon çerçevesi, nesneyi veren çok karmaşık bir singleton….
Ian Ringrose

1
Singleton, diğer nesnelerin örnekleri arasında yönetici nesnesi olarak kullanılabilir; bu nedenle, singleton'ın birbirlerinin singleton örneği üzerinden iletişim kurması gereken tek bir örneği olmalıdır.
Levent Divilioğlu

Ben bir yan soru var: herhangi bir Singleton uygulaması da aslında bir sınıf örneği oluşturmadan ("statik" sınıf ("fabrika" / "init" yöntemi ile) kullanılarak uygulanabilir (statik sınıf bir olduğunu söyleyebiliriz tür Singleton uygulaması, ancak ...) - neden statik bir sınıf yerine gerçek bir Singleton (tekli olmasını sağlayan tek bir sınıf örneği) kullanılmalı? Düşünebilmemin tek nedeni belki de "anlambilim" içindir, ancak bu anlamda bile, Singleton kullanım örnekleri tanım gereği gerçekten bir "sınıf-> örnek" ilişkisi gerektirmez ... peki ... neden?
Yuval A.

Yanıtlar:


358

Gerçek arayışı üzerine bir Singleton kullanmanın aslında çok az "kabul edilebilir" nedeni olduğunu keşfettim.

İnternette tekrar tekrar ortaya çıkma eğiliminin bir nedeni, (bahsettiğiniz) bir "logging" sınıfıdır. Bu durumda, bir sınıfın tek bir örneği yerine bir Singleton kullanılabilir çünkü bir günlük kaydı sınıfının genellikle bir projedeki her sınıf tarafından tekrar tekrar kullanılması gerekir. Her sınıf bu kayıt sınıfını kullanırsa, bağımlılık enjeksiyonu hantal hale gelir.

Günlüğe kaydetme, kodunuzun yürütülmesini etkilemediğinden "kabul edilebilir" bir Singleton'a özgü bir örnektir. Günlüğe kaydetmeyi devre dışı bırakın, kod yürütme aynı kalır. Aynı şekilde etkinleştirin. Misko bunu aşağıdaki şekilde Tek Köklerin Kök Nedeni'ne koyar , "Buradaki bilgiler tek yönlü akar: Uygulamanızdan kaydediciye. Günlükçüler küresel durum olsa da, günlükçülerden uygulamanıza hiçbir bilgi akışı olmadığından günlükler kabul edilebilir."

Eminim başka geçerli nedenler de vardır. Alex Miller, " Desenlerden Nefret Ediyorum " da, servis bulma ve müşteri tarafı kullanıcı arayüzlerinin muhtemelen "kabul edilebilir" seçimlerden bahsediyor.

Daha fazla oku Singleton Seni seviyorum, ama sen beni aşağı indiriyorsun.


3
@ArneMertz Sanırım bu biri.
Aralık'ta Saldırı

1
Neden sadece küresel bir nesne kullanamıyorsunuz? Neden bir singleton olmak zorunda?
Ayakkabı

1
Bir günlükleme util için statik yöntem düşünüyorum?
Skynet

1
Singletons, kaynakları yönetmeniz gerektiğinde en iyisidir. Örneğin, Http bağlantıları. Tek bir müşteri için 1 milyon http istemcisi kurmak istemezsiniz, bu çılgın savurgan ve yavaştır. Yani bağlantı havuzu http istemcisi ile bir singleton çok daha hızlı ve kaynak dostu olacaktır.
Cogman

3
Bunun eski bir soru olduğunu biliyorum ve bu cevaptaki bilgiler harika. Ancak, OP açıkça belirtildiğinde neden kabul edilen cevap olduğunu anlamakta güçlük çekiyorum: "Bana singletonu kullanmanın mantıklı olduğu eski eski kaydedici dışında senaryolar ver."
Francisco C.

124

Bir Singleton adayının üç gereksinimi karşılaması gerekir:

  • paylaşılan kaynağa eşzamanlı erişimi denetler.
  • kaynağa erişim, sistemin farklı, farklı bölümlerinden istenecektir.
  • sadece bir nesne olabilir.

Önerilen Singleton'unuzda bu gereksinimlerden yalnızca bir veya ikisi varsa, yeniden tasarım neredeyse her zaman doğru seçenektir.

Örneğin, bir yazıcı biriktiricisinin birden fazla yerden çağrılması olası değildir (Yazdır menüsü), böylece eşzamanlı erişim sorununu çözmek için muteksleri kullanabilirsiniz.

Basit bir kaydedici, geçerli bir Singletonun en açık örneğidir, ancak bu daha karmaşık günlükleme düzenleriyle değişebilir.


3
Nokta 2 ile katılmıyorum. Nokta 3 gerçekten sadece bir nedeni değil (çünkü sen-ebilmek demek o anlamına gelmez anlamına gelmez) ve 1 iyi bir nokta ama yine de bunu görmüyorum. Paylaşılan kaynağın bir disk sürücüsü veya db önbelleği olduğunu varsayalım. Başka bir sürücü ekleyebilir veya başka bir şeye odaklanan bir db önbelleğine sahip olabilirsiniz (örneğin, bir iş parçacığı için özel bir tablo için önbellek, diğeri daha genel amaçlıdır).

15
Bence "aday" kelimesini kaçırdınız. Bir Singleton adayının üç şartı yerine getirmesi gerekir; bir şeyin gereksinimleri karşılaması, bunun Singleton olması gerektiği anlamına gelmez. Başka tasarım faktörleri olabilir :)
metao

45

Yalnızca başlangıçta okunması gereken yapılandırma dosyalarının okunması ve bir Singleton içinde kapsüllenmesi.


8
Properties.Settings.DefaultNET'te benzer .
Nick Bedford

9
@Paul, "No-singleton camp", yapılandırma nesnesinin, küresel olarak erişilebilir hale getirmek yerine, tek başına ihtiyaç duyulan işlevlere geçirilmesi gerektiğini belirtir.
Pacerier

2
Katılmıyorum. Yapılandırma veritabanına taşındığında, her şey berbat olur. Yapılandırmanın yolu bu singleton dışındaki herhangi bir şeye bağlıysa, bunların da statik olması gerekir.
rr-

3
@PaulCroarkin Bunu genişletebilir ve bunun nasıl faydalı olduğunu açıklayabilir misiniz?
AlexG

1
@ rr- Yapılandırma veritabanına taşınırsa, yine de onu gerektiren işlevlere aktarılacak olan bir yapılandırma nesnesine kapsüllenebilir. (PS: "No-singleton" kampında değilim).
Sheppard

36

Paylaşılan bir kaynağı yönetmeniz gerektiğinde tek birton kullanırsınız. Örneğin bir yazıcı biriktiricisi. Aynı kaynak için çakışan isteklerden kaçınmak için uygulamanızda biriktiricinin yalnızca tek bir örneği olmalıdır.

Veya bir veritabanı bağlantısı veya bir dosya yöneticisi vb.


30
Bu yazıcı biriktirici örneğini duydum ve sanırım biraz topal. Kim birden fazla biriktiriciye sahip olamayacağımı kim söyledi? Zaten bir yazıcı biriktiricisi nedir? Çakışmayan veya farklı sürücüler kullanamayan farklı yazıcı türlerim varsa ne olur?
1800 BİLGİ

6
Bu sadece bir örnek ... herkesin örnek olarak kullandığı herhangi bir durum için örneği işe yaramaz hale getiren alternatif bir tasarım bulabileceksiniz. Biriktiricinin birden çok bileşen tarafından paylaşılan tek bir kaynağı yönettiğini varsayalım. İşe yarıyor.
Vincent Ramdhanie

2
Dörtlü Çete için klasik bir örnek. Bence denenmiş gerçek bir kullanım senaryosu ile bir cevap daha yararlı olacaktır. Yani Singleton'un en iyi çözüm olduğunu düşündüğünüz bir durum.
Andrei Vajna II

Paylaşılan bir kaynak benim düşünceme göre çok geniş bir örnek. Hatalı çalışan bir 'biriktirici' uygulamasını enjekte edemediğinizde, yazdırma biriktiricisini kullanan nesnelerin düzgün çalışmayan bir biriktirici karşısında düzgün çalıştığını nasıl test edersiniz? kısa ve bilgisiz olsa da kabul edilen cevap kitabımda çok daha güvenli bir yaklaşımdır
Rune FS

Yazıcı biriktiricisi nedir?
RayLoveless

23

Bazı genel durumları (kullanıcı dili, yardım dosyayolu, uygulama yolu) saklayan tekiltonlar makul. İş mantığını kontrol etmek için tekil düğmeler kullanmaya özen gösterin - tekil neredeyse her zaman birden fazla olur


4
Kullanıcı dili, yalnızca bir kullanıcının sistemi kullanabileceği varsayımı ile yalnızca tek dil olabilir.
Samuel Åslund

… Ve bir kullanıcı sadece bir dil konuşuyor.
spectras

17

Veritabanına bağlantıyı (veya bağlantı havuzunu) yönetme.

Harici yapılandırma dosyalarındaki bilgileri almak ve saklamak için de kullanırım.


2
Bir veritabanı bağlantı üreticisi bir Fabrika örneği olmaz mıydı?
Ken

3
@Ken neredeyse her durumda o fabrikanın tekil olmasını istersiniz.
Chris Marisic

2
@Federico, "No-singleton kampı", bu veritabanı bağlantı (ları) nın, küresel olarak erişilebilir hale getirmek yerine (onları singleton olarak adlandırmak yerine) onlara ihtiyaç duyan işlevlere aktarılması gerektiğini belirtir.
Pacerier

3
Bunun için gerçekten bir singletona ihtiyacınız yok. Enjekte edilebilir.
Nestor Ledon

11

Tek birtonu kullanmanın yollarından biri, bir kaynağa erişimi denetleyen tek bir "aracı" olması gereken bir örneği kapsamaktır. Singletons günlükçülerde iyidir çünkü bir dosyaya yalnızca aracılık olarak erişilebilen bir aracıya erişim sağlarlar. Günlüğe kaydetme gibi bir şey için, yazmaları bir günlük dosyası gibi bir şeye soyutlamanın bir yolunu sağlarlar - tekli önbelleğinize vb.

Ayrıca, birçok pencere / iş parçacığı / vb. İçeren bir uygulamanız olduğu, ancak tek bir iletişim noktası gerektiren bir durum düşünün. Bir keresinde, uygulamamın başlatılmasını istediğim işleri kontrol etmek için birini kullandım. Singleton, işleri serileştirmekten ve durumlarını programın ilgilenilen diğer herhangi bir bölümüne göstermekten sorumluydu. Bu tür bir senaryoda, bir singletona uygulamanızın içinde çalışan bir "sunucu" sınıfı gibi bakabilirsiniz ... HTH


3
Kaydediciler çoğunlukla Tekliton'dur, böylece günlüğe kaydetme nesnelerinin geçirilmesi gerekmez. Bir günlük akışının iyi bir şekilde uygulanması, bir Singleton olsun ya da olmasın, eşzamanlı yazma işlemlerinin imkansız olmasını sağlayacaktır.
metao

10

Tüm uygulama tarafından paylaşılan bir kaynağa erişimi yönetirken tek birton kullanılmalıdır ve potansiyel olarak aynı sınıfın birden çok örneğine sahip olmak yıkıcı olacaktır. Paylaşılan kaynaklara güvenli erişimin bu tür bir modelin hayati önem taşıyabileceğinin çok iyi bir örneği olduğundan emin olmak.

Singletons kullanırken, bağımlılıkları yanlışlıkla gizlemediğinizden emin olmalısınız. İdeal olarak, tektonlar (bir uygulamadaki çoğu statik değişken gibi), uygulama için başlatma kodunuzun yürütülmesi sırasında ayarlanmalıdır (C # yürütülebilir dosyalar için statik void Main (), java yürütülebilirler için statik void main ()) ve ardından gerektiren tüm diğer sınıflar. Bu, test edilebilirliği korumanıza yardımcı olur.


8

Bence singleton kullanımı, veritabanlarındaki birebir ilişkiyle aynı düşünülebilir. Kodunuzun bir nesnenin tek bir örneğiyle çalışması gereken çok sayıda farklı parçası varsa, bu durumda teklitonların kullanılması mantıklıdır.


6

Pratik bir örnek, Test :: Builder'da bulunabilir hemen hemen her modern Perl test modülünü destekleyen Sınıf . Test :: Builder singleton, test sürecinin durumunu ve geçmişini (geçmiş test sonuçları, çalıştırılan test sayısını sayar) ve test çıktısının nereye gittiği gibi şeyleri depolar ve aracılar. Bunların hepsi, farklı yazarlar tarafından yazılan çoklu test modüllerini tek bir test komut dosyasında birlikte çalışmak için koordine etmek için gereklidir.

Test :: Builder'ın singletonunun tarihi eğiticidir. Aramak new()her zaman aynı nesneyi verir. İlk olarak, tüm veriler nesnenin kendisinde hiçbir şey olmadan sınıf değişkenleri olarak saklandı. Bu Test :: Builder'ın kendisini test etmek isteyene kadar çalıştı. Daha sonra davranışını ve çıktısını yakalamak ve test etmek ve biri gerçek test nesnesi olmak için bir kukla olarak bir kurulum olmak üzere iki Test :: Builder nesnesine ihtiyacım vardı. Bu noktada Test :: Builder gerçek bir nesneye dönüştürüldü. Singleton nesnesi sınıf verisi olarak saklanır ve new()her zaman onu döndürür. create()yeni bir nesne oluşturmak ve testi etkinleştirmek için eklendi.

Şu anda, kullanıcılar Test :: Builder'ın bazı davranışlarını kendi modüllerinde değiştirmek istiyorlar, ancak test geçmişi tüm test modüllerinde ortak kalırken, diğerlerini yalnız bırakıyorlar. Şimdi olan şey, monolitik Test :: Builder nesnesinin onları bir araya getiren Test :: Builder örneği ile daha küçük parçalara (geçmiş, çıktı, biçim ...) bölünmesidir. Şimdi Test :: Builder artık bir singleton olmak zorunda değil. Tarih gibi bileşenleri de olabilir. Bu, bir tektonun esnek olmayan gereksinimini bir seviyeye iter. Parçaları karıştırmak ve eşleştirmek için kullanıcıya daha fazla esneklik sağlar. Daha küçük tekil nesneler artık verileri depolayabilir ve içerdikleri nesneler nasıl kullanılacağına karar verir. Hatta bir Test :: Builder sınıfının Test :: Builder geçmişini ve çıktı tektonlarını kullanarak oynatmasına izin verir.

Veri bütünlüğünü sağlamak için mümkün olan en küçük miktarda davranışa sahip olan tek paylaşılan verilerin etrafına singleton konularak hafifletilebilen verilerin koordinasyonu ile davranış esnekliği arasında bir itme ve çekme var gibi görünüyor.


5

Veritabanından veya dosyadan bir yapılandırma Özellikleri nesnesi yüklediğinizde, bu nesnenin tekli bir öğeye sahip olmasına yardımcı olur; sunucu çalışırken değişmeyecek statik verileri yeniden okumaya devam etmek için bir neden yoktur.


2
Neden verileri yalnızca bir kez yüklemeyip yapılandırma nesnesini gerektiği gibi iletmeyesiniz?
lagweezle

etrafta dolaşmanın ne olduğunu ??? Ben olsaydı ... Ben 20 argümanlarla kurucular olurdu gereken her nesneyi etrafında geçmesine
Enerccio

@Enerccio Kapsülleme olmadan 20 farklı kişiye dayanan nesneleriniz varsa, büyük tasarım sorunlarınız var demektir.
spectras

@spectras Yaparım? GUI iletişim kutusunu uygularsam, ihtiyacınız olacak: havuz, yerelleştirme, oturum verileri, uygulama verileri, widget üst öğesi, istemci verileri, izin yöneticisi ve muhtemelen daha fazlası. Tabii, bazılarını toplayabilirsiniz, ama neden? Şahsen ben bahar ve yönleri sadece widget sınıfına tüm bu bağımlılıkları otomatik bağlamak ve her şeyi ayrıştırmak için kullanın.
Enerccio

Bu kadar devletiniz varsa, belirli bir bağlam için ilgili yönlerin bir görünümünü vererek bir cephe uygulamayı düşünebilirsiniz. Neden? Çünkü singleton veya 29-arg yapıcı antipatilleri olmadan temiz bir tasarıma izin verecekti. Aslında gui diyalogunuzun tüm bu şeylere erişmesi gerçeği "tek sorumluluk ilkesinin ihlali" diye bağırır.
spectras

3

Herkesin söylediği gibi, paylaşılan bir kaynak - özellikle eşzamanlı erişimi işleyemeyen bir şey.

Gördüğüm özel bir örnek Lucene Arama İndeksi Yazarı.


1
Ve yine, IndexWriter bir singleton değil ...
Mark

3

Durum modelini uygularken (GoF kitabında gösterildiği gibi) Singleton'u kullanabilirsiniz. Bunun nedeni, somut Devlet sınıflarının kendilerine ait bir durumlarının olmaması ve eylemlerini bir bağlam sınıfı açısından gerçekleştirmeleridir.

Ayrıca Soyut Fabrika'yı bir singleton yapabilirsiniz.


Şu anda bir projede ele aldığım durum bu. Bağlam yöntemlerinden yinelenen koşullu kodu kaldırmak için bir durum deseni kullandım. Devletin kendi örnek değişkeni yoktur. Ancak, onları tekil yapmam gerekip gerekmediği konusunda kararsızım. Durum her değiştiğinde yeni bir örnek başlatılır. Bu israf gibi görünmektedir, çünkü örneğin diğerinden farklı olabilmesinin bir yolu yoktur (çünkü örnek değişkenleri yoktur). Neden kullanmamam gerektiğini anlamaya çalışıyorum.
kiwicomb123

1
@ kiwicomb123 setState()Devlet yaratma politikasına karar vermekten sorumlu olmaya çalışın . Programlama dilinizin şablonları veya jenerikleri desteklemesi yardımcı olur. Singleton yerine, bir durum nesnesinin somutlaştırılmasının aynı global / statik durum nesnesini yeniden kullanacağı Monostate desenini kullanabilirsiniz . Durumu değiştirmek için sözdizimi değişmeden kalabilir, çünkü kullanıcılarınızın somutlaştırılmış durumun bir Monostate olduğunun farkında olması gerekmez.
Emile Cormier

Tamam, benim durumlarımda tüm yöntemleri statik hale getirebilirim, bu yüzden yeni bir örnek oluşturulduğunda aynı yüke sahip değil mi? Biraz kafam karıştı, Monostate paternini okumam gerekiyor.
kiwicomb123

@ kiwicomb123 Hayır, Monostate tüm üyeleri statik hale getirmekle ilgili değildir. Okumak daha iyi, daha sonra ilgili sorular ve cevaplar için SO kontrol edin.
Emile Cormier

Bunun daha fazla oy alması gerektiğini düşünüyorum. Soyut fabrika yeterince yaygındır ve fabrikalar vatansız, vatansız olmada kararlı olduğundan ve geçersiz kılınmayan statik yöntemlerle (Java'da) uygulanamayacağından, singleton kullanımı iyi olmalıdır.
DPM

3

Paylaşılan kaynaklar. Özellikle PHP'de bir veritabanı sınıfı, bir şablon sınıfı ve bir global değişken depo sınıfı. Tümünün kod boyunca kullanılan tüm modüller / sınıflar tarafından paylaşılması gerekir.

Bu gerçek bir nesne kullanımıdır -> şablon sınıfı, oluşturulmakta olan sayfa şablonunu içerir ve sayfa çıktısına eklenen modüller tarafından şekillendirilir, eklenir, değiştirilir. Bunun olabilmesi için tek bir örnek olarak saklanması gerekir ve aynı şey veritabanları için de geçerlidir. Paylaşılan bir veritabanı singletonu ile, tüm modüllerin sınıfları sorgulara erişebilir ve bunları yeniden çalıştırmak zorunda kalmadan alabilir.

Global değişken depo tekli, size küresel, güvenilir ve kolay kullanılabilir bir değişken depo sağlar. Kodunuzu çok fazla düzenler. Bir dizideki tüm yapılandırma değerlerinin tek birtondaki gibi olduğunu düşünün:

$gb->config['hostname']

veya aşağıdaki gibi bir dizideki tüm dil değerlerine sahip olmak:

$gb->lang['ENTER_USER']

Sayfanın kodunu çalıştırmanın sonunda, şimdi olgunlaşın:

$template

Singleton, $gbyerine geçmesi için lang dizisine sahip bir singleton ve tüm çıktı yüklenmiş ve hazır. Bunları, şimdi olgun şablon nesnesinin sayfa değerinde bulunan anahtarların yerine koyar ve daha sonra kullanıcıya sunarsınız.

Bunun en büyük avantajı, istediğiniz herhangi bir işlem sonrası herhangi bir işlem yapabilmenizdir. Tüm dil değerlerini google translate veya başka bir translate hizmetine aktarabilir ve bunları geri alabilir ve örneğin, çevrilmiş yerlerine değiştirebilirsiniz. veya sayfa yapılarında veya içerik dizelerinde istediğiniz gibi değiştirebilirsiniz.


21
Yanıtınızı birden fazla paragrafa bölmek ve okunabilirlik için kod parçalarını engellemek isteyebilirsiniz.
Justin

1

Belirli altyapı kaygılarını tekil veya küresel değişkenler olarak yapılandırmak çok pragmatik olabilir. Buna en sevdiğim örnek, çerçeveye bağlantı noktası olarak tektonları kullanan Bağımlılık Enjeksiyonu çerçeveleridir.

Bu durumda, kitaplığı kullanmayı basitleştirmek ve gereksiz karmaşıklığı önlemek için altyapıya bağımlı olursunuz.


0

Takılabilir modüllerle uğraşırken komut satırı parametrelerini kapsayan bir nesne için kullanıyorum. Ana program, yüklenen modüller için komut satırı parametrelerinin ne olduğunu bilmez (ve hangi modüllerin yüklendiğini her zaman bilmez). Örneğin, herhangi bir parametreye ihtiyaç duymayan ana yükler A (neden fazladan bir işaretçi / referans / ne olursa olsun, emin değilim - kirlilik gibi görünüyor), sonra X, Y ve Z modüllerini yükler. bunlardan, örneğin X ve Z, parametrelere ihtiyaç duyar (veya kabul eder), bu nedenle hangi parametrelerin kabul edileceğini söylemek için komut satırı singletonunu geri çağırırlar ve çalışma zamanında kullanıcının gerçekten herhangi bir onları.

Birçok yönden, sorgu başına yalnızca bir işlem kullanıyorsanız (diğer mod_ * yöntemleri bunu yapmazsa, CGI parametrelerini işlemek için bir singleton benzer şekilde çalışacaktır, bu yüzden orada kötü olurdu - bu yüzden yapmamanız gerektiğini söyleyen argüman t mod_perl'e veya herhangi bir dünyaya bağlantı kurmanız durumunda mod_cgi dünyasında singletons kullanın).


-1

Belki de kodlu bir örnek.

Burada ConcreteRegistry, bir poker oyununda, paket ağacının oyunun birkaç temel çekirdeğine (yani model, görünüm, kontrolör, çevre vb.

http://www.edmundkirwan.com/servlet/fractal/cs1/frac-cs40.html

Ed.


1
Bağlantı kesildi, ancak görünüm bilgilerini uygulama boyunca erişilecek tek birtona kaydediyorsanız, MVC'nin noktasını kaçırıyorsunuz. Bir görünüm, modeli kullanan bir denetleyici tarafından güncellenir (ve iletişim kurar). Burada göründüğü gibi, muhtemelen Singleton'ın yanlış kullanımı ve bir yeniden düzenleme sırası.
drharris

-9

1 - İlk cevap hakkında bir yorum:

Statik Logger sınıfına katılmıyorum. bu bir uygulama için pratik olabilir, ancak birim testi için değiştirilemez. Statik bir sınıf, bir test çiftiyle değiştirilemez. Birim testi yapmazsanız, sorunu burada görmezsiniz.

2 - Elle bir singleton oluşturmamaya çalışıyorum. Yalnızca, ortakları nesneye enjekte etmeme izin veren yapıcılar ile basit bir nesne oluşturuyorum. Bir singletona ihtiyacım olsaydı, bir bağımlılık inyection çerçevesi (Spring.NET, Unity for .NET, Spring for Java) ya da başka bir şey kullanırdım.


11
Bir cevabın altındaki bağlantıya tıklayarak cevaplar üzerine doğrudan yorum yapmalısınız; bu şekilde okumak çok daha kolay. Ayrıca, tepede gördüğünüz cevap muhtemelen ilk değil. Yanıtlar her zaman yeniden sıralanır.
Ross

neden birim test günlüğü tutulmasını istersiniz?
Enerccio

"Statik Logger sınıfı" ile statik Logger örneği arasında büyük bir fark vardır . Tektonlu desen "sınıfınızı statik yap" demez, bir nesnenin örneğine statik erişmeyi sağlar. Örneğin, ILogger logger = Logger.SingleInstance();bu yöntemin statik olduğu ve bir ILogger öğesinin statik olarak depolanmış bir örneğini döndürdüğü durumlarda. "Bir bağımlılık enjeksiyon çerçevesi" örneğini kullandınız. Neredeyse tüm DI kapları tek tonludur; konfigürasyonları statik olarak tanımlanır ve sonuçta tek bir servis sağlayıcı arayüzünden erişilir / depolanır.
Jon Davis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.